Как отобразить строку символов в ее прописной эквивалент при этом не изменяя саму строку?

Имеется пример из книги преобразующий строку символов в ее прописной эквивалент:

void stringupper(char *str);

int main()
{
    setlocale(LC_ALL, "Russian");
    char str[80];
    strcpy(str, "Мне нарвится С++");
    stringupper(str);
    cout << str;
    return 0;
}

void stringupper (char *str)
{
    while(*str){
        *str = toupper(*str);
        str++;
    }
}

Как отобразить строку символов в ее прописной эквивалент при этом не изменяя саму строку? Например, чтобы Прописной текст отображался в функции stringupper, а строчные в main.


Ответы (3 шт):

Автор решения: AR Hovsepyan

Можно по разному, но ближе к вашему коду:

const char stringupper(const char* str)
{    
    static size_t i = 0,
                  size = strlen(str);
    if (i >= size)
        return 0;   
    return  toupper(str[i++]);
}
int main() {
   
    //...
    char str[] = "Мне нарвится С++";    
    while(const char c = stringupper(str))
        cout << c;
    return 0;
}
→ Ссылка
Автор решения: Maggot

Ну вроде рус символы как минимум wchar_t Воспользуйтесь фасетом - https://en.cppreference.com/w/cpp/locale/use_facet

PrintUpper - специально создает копию строки

Смена локили тут по *nix - если у вас вин - используйте известные Вам методы

попробуйте так :

#include <string>
#include <iostream>

void WStringToUpper(std::wstring& line) {
  std::use_facet<std::ctype<wchar_t>>(std::locale()).toupper(&line[0], &line[0] + line.size());
}

void PrintUpper(std::wstring line) {
  WStringToUpper(line);
  std::wcout << line << std::endl;
}

void SetLocale(std::string _locale) {
  std::string locale{setlocale(LC_ALL, NULL)};
  if (locale != _locale) {
    locale.assign(setlocale(LC_ALL, _locale.c_str()));
    if (locale != _locale) {
      throw std::runtime_error{"Error change locale"};
    }
  }
  std::locale::global(std::locale(locale.c_str()));
}

int main() {
  SetLocale("ru_RU.UTF-8");

  std::wstring exmpl{L"привет hello"};

  std::wcout << exmpl << std::endl;
  PrintUpper(exmpl);

  return 0;
}
→ Ссылка
Автор решения: Furious_pawn

Спасибо за ответы. Но так как я только начинаю изучать С++, я ничего не понял из ваших ответов ))). Читая книгу дальше, смог сам ответить на свой вопрос. Еще раз спасибо за ответы.

#include <cstring>
#include <iostream>
using namespace std;

void stringupper(const char *str);

int main()
{
    setlocale(LC_ALL, "Russian");
    char str[80];
    strcpy(str, "Мне нарвится С++");
    cout << str<< endl; // сейчас str = "Мне нарвится С++"
    stringupper(str);   /* отобразили в коносоли "МНЕ НРАВИТСЯ С++, 
                       но str отслась без изменений" */
    cout << str;       // Проверяем что str осталась без именений.     
    return 0;
}

//void stringupper ( char *str)     
void stringupper (const char *str)
{
    while(*str){
        //*str = toupper(*str);
        cout << (char )toupper(*str);
        str++;
    }
    cout << endl;
}
→ Ссылка