Как мне изменить регистр строки в C ++? - PullRequest
3 голосов
/ 03 ноября 2010

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

Ответы [ 6 ]

10 голосов
/ 03 ноября 2010

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

#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;
}
7 голосов
/ 03 ноября 2010

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

1 голос
/ 03 ноября 2010

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

0 голосов
/ 23 ноября 2016
#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;
}
0 голосов
/ 03 ноября 2010

Вы также можете перевернуть 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 может использовать класс (функтор), а также обычную функцию.Поэтому для многобайтовых символов мы можем хранить состояние, пока символ замены всегда будет иметь один и тот же первый элемент.Если это не так, то преобразование не будет работать с обычными итераторами.Однако вы можете написать собственный итератор для обработки многобайтовых символьных строк, которые будут перебирать печатаемый символ за раз (итератору придется обращаться к многобайтовым символам, представляющим символ).

0 голосов
/ 03 ноября 2010
char *str = "this is a test string";
while(*str != '\0') {
    if(*str <= 'Z' && *str >= 'A') {
       *str += 32;
    }
    if(*str >= 'a' && *str <= 'z') {
       *str -= 32;
    }
 str++;
}

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

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...