Как отобразить строку символов в ее прописной эквивалент при этом не изменяя саму строку?
Имеется пример из книги преобразующий строку символов в ее прописной эквивалент:
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 шт):
Можно по разному, но ближе к вашему коду:
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;
}
Ну вроде рус символы как минимум 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;
}
Спасибо за ответы. Но так как я только начинаю изучать С++, я ничего не понял из ваших ответов ))). Читая книгу дальше, смог сам ответить на свой вопрос. Еще раз спасибо за ответы.
#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;
}