Как изменить регистр строки в С++?

Вопрос:У меня есть строка, которая может содержать числа, а также буквы верхнего и нижнего регистра. Мне нужно преобразовать все прописные буквы в нижний регистр и наоборот. Как это можно сделать? Лучший ответ: Итерируйте строку и используйте isupper(), чтобы определить, является ли каждый символ прописным или нет. Если он заглавный, преобразуйте его в нижний регистр, используя

Вопрос:

У меня есть строка, которая может содержать числа, а также буквы верхнего и нижнего регистра. Мне нужно преобразовать все прописные буквы в нижний регистр и наоборот. Как это можно сделать?

Лучший ответ:

Итерируйте строку и используйте isupper(), чтобы определить, является ли каждый символ прописным или нет. Если он заглавный, преобразуйте его в нижний регистр, используя tolower(). Если он не заглавный, преобразуйте его в верхний регистр, используя toupper().

Ответ №1

Вот способ сделать это без повышения:

#include <string> #include <algorithm> #include <cctype> #include <iostream> char change_case (char c) { if (std::isupper(c)) return std::tolower(c); else return std::toupper(c); } int main() { std::string str; str = «hEllo world»; std::transform(str.begin(), str.end(), str.begin(), change_case); std::cout << str; return 0; } Ответ №2

Вы можете выполнить итерацию по строке и добавить или вычесть соответствующий номер из каждого альфа-символа, чтобы значение ASCII было разрешено для противоположного значения ASCII-кода.

Ответ №3char *str = «this is a test string»; while(*str != ‘’) { if(*str <= ‘Z’ && *str >= ‘A’) { *str += 32; } if(*str >= ‘a’ && *str <= ‘z’) { *str -= 32; } str++; }

Небезопасно, просто давая вам эту идею.
Это может быть очень полезно для этой домашней работы:

Ответ №4

Вы также можете перевернуть 32-разрядный бит: работает с символами ASCII, таким образом:

char flipcase(char x) { if( ::isalpha(x) ) { return x ^ 32; } }

Вы также можете использовать таблицу. Создайте статическую таблицу, затем

char flipcase( char x ) { return fliptable[x]; }

Последний способ имеет то преимущество, что его можно использовать для иностранных наборов символов, если они не являются многобайтными – для этого он не будет работать. Вы можете создать аналогичную таблицу для символов wchar_t с любым набором символов, который вы используете. Для хранения таблицы требуется небольшой объем использования памяти, если размер вашего персонажа не превышает 2, хотя он слишком сильно использует UTF-32, а время поиска тривиально. Конечно, на самом деле вы сохранили бы небольшую структуру для каждого персонажа с ее чертами.

С любым из вышеперечисленных вы будете использовать std:: transform.

И теперь действительно умный бит: std:: transform может использовать класс (функтор), а также простую функцию. Поэтому для многобайтовых символов мы можем сохранять состояние, пока символ замены всегда будет иметь тот же самый первый элемент. Если это не так, то преобразование не будет работать с обычными итераторами. Однако вы можете написать пользовательский итератор для обработки многобайтовых строк символов, которые будут перебирать печатаемый символ за раз (итератору пришлось бы разыменовывать многобайтовые символы, представляющие символ).

Ответ №5#include <iostream> #include <string> #include <cctype> using namespace std; int main(){ //Changecase to Uppercase string var = «This is a String.»; for (unsigned int i = 0; i < var.length(); i++){ if (islower(var[i])) var[i] = toupper(var[i]); } cout << var << endl; /* Output: THIS IS A STRING. */ //Changecase to Lowercase var = «This is a String.»; for (unsigned int i = 0; i < var.length(); i++){ if (isupper(var[i])) var[i] = tolower(var[i]); } cout << var << endl; /* Output: this is a string. */ //Flip the case var = «This is a String.»; for (unsigned int i = 0; i < var.length(); i++){ if (isupper(var[i])) var[i] = tolower(var[i]); else var[i] = toupper(var[i]); } cout << var << endl; /* Output: tHIS IS A sTRING. */ system(«pause»); return 0; }

Оцените статью
Добавить комментарий