string — преобразование одного символа в нижний регистр, в tolower возвращается целое число

Я пытаюсь преобразовать строку в нижний регистр, и я рассматриваю ее как символ * и повторяю каждый индекс. Проблема в том, что tolower Функция, которую я читал в Интернете, на самом деле не преобразовывает символ в нижний регистр: он принимает символ в качестве ввода и возвращает целое число.

cout << tolower('T') << endl;

печать 116 на консоль, когда она должна печатать T,

Есть ли лучший способ для меня, чтобы преобразовать строку в нижний регистр?
Я смотрел в Интернете, и большинство источников говорят «использование tolower и перебрать массив символов «, который, кажется, не работает для меня.

Итак, мои два вопроса:

  1. Что я делаю не так с tolower функция, которая заставляет его возвращать 116 вместо «т», когда я звоню tolower('T')

  2. Существуют ли более эффективные способы преобразования строки в нижний регистр в C ++, кроме использования tolower на каждого отдельного персонажа?

5

Решение

Это потому, что есть два разных tolower функции. Тот, который вы используете этот, который возвращает int, Вот почему он печатает 116. Это значение ASCII 't', Если вы хотите напечатать char, вы можете просто привести его обратно к char,

В качестве альтернативы, вы можете использовать этот, который на самом деле возвращает тип, который вы ожидаете получить:

std::cout << std::tolower('T', std::locale()); // prints t

В ответ на ваш второй вопрос:

Есть ли лучшие способы преобразовать строку в нижний регистр в C ++, кроме использования tolower для каждого отдельного символа?

Нету.

9

Другие решения

116 действительно правильное значение, однако это просто вопрос того, как std::cout обрабатывает целые числа, используйте char(tolower(c)) достичь желаемых результатов

std::cout << char(tolower('T')); // print it like this
2

Это даже более странно, чем это int и возвращает int, Увидеть http://en.cppreference.com/w/cpp/string/byte/tolower.

Вы должны убедиться, что передаваемое вами значение представлено как unsigned char — отрицательные значения не допускаются, даже если char подписан

Таким образом, вы можете получить что-то вроде этого:

char c = static_cast<char>(tolower(static_cast<unsigned char>('T')));

Ужасно не так ли? Но в любом случае преобразование одного символа за раз очень ограниченно. Попробуйте преобразовать ‘ß’ в верхний регистр, например.

2

Понизить это int, поэтому он возвращает int. Если вы проверите #include <ctype> вы увидите, что определение int tolower ( int c ); Вы можете использовать цикл, чтобы пройти через строку и изменить каждый отдельный символ в нижний регистр. Например

while (str[i]) // going trough string
{
c=str[i]; // ging c value of current char in string
putchar (tolower(c)); // changing to lower case
i++;  //incrementing
}
1

документация int to_lower(int ch) предписывает, что ch должен быть представлен как unsigned char или должен быть равен EOF (который обычно -1, но не надейтесь на это).

Нередко функции манипулирования символами, унаследованные от стандартной библиотеки c, работают в терминах целочисленных значений. Для этого есть две причины:

  1. В первые дни C все аргументы были переведены в int (прототипы функций не существовали).

  2. Для согласованности эти функции должны обрабатывать случай EOF, который по понятным причинам не может быть значением, представляемым char, поскольку это будет означать, что нам придется потерять одну из законных кодировок для персонажа.

http://en.cppreference.com/w/cpp/string/byte/tolower

Ответ заключается в приведении результата к символу перед печатью.

например.:

std::cout << static_cast<char>(std::to_lower('A'));
1
По вопросам рекламы [email protected]