Я пытаюсь преобразовать строку в нижний регистр, и я рассматриваю ее как символ * и повторяю каждый индекс. Проблема в том, что tolower
Функция, которую я читал в Интернете, на самом деле не преобразовывает символ в нижний регистр: он принимает символ в качестве ввода и возвращает целое число.
cout << tolower('T') << endl;
печать 116
на консоль, когда она должна печатать T
,
Есть ли лучший способ для меня, чтобы преобразовать строку в нижний регистр?
Я смотрел в Интернете, и большинство источников говорят «использование tolower
и перебрать массив символов «, который, кажется, не работает для меня.
Итак, мои два вопроса:
Что я делаю не так с tolower
функция, которая заставляет его возвращать 116 вместо «т», когда я звоню tolower('T')
Существуют ли более эффективные способы преобразования строки в нижний регистр в C ++, кроме использования tolower
на каждого отдельного персонажа?
Это потому, что есть два разных tolower
функции. Тот, который вы используете этот, который возвращает int
, Вот почему он печатает 116. Это значение ASCII 't'
, Если вы хотите напечатать char
, вы можете просто привести его обратно к char
,
В качестве альтернативы, вы можете использовать этот, который на самом деле возвращает тип, который вы ожидаете получить:
std::cout << std::tolower('T', std::locale()); // prints t
В ответ на ваш второй вопрос:
Есть ли лучшие способы преобразовать строку в нижний регистр в C ++, кроме использования tolower для каждого отдельного символа?
Нету.
116 действительно правильное значение, однако это просто вопрос того, как std::cout
обрабатывает целые числа, используйте char(tolower(c))
достичь желаемых результатов
std::cout << char(tolower('T')); // print it like this
Это даже более странно, чем это 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')));
Ужасно не так ли? Но в любом случае преобразование одного символа за раз очень ограниченно. Попробуйте преобразовать ‘ß’ в верхний регистр, например.
Понизить это 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
}
документация int to_lower(int ch)
предписывает, что ch должен быть представлен как unsigned char
или должен быть равен EOF
(который обычно -1, но не надейтесь на это).
Нередко функции манипулирования символами, унаследованные от стандартной библиотеки c, работают в терминах целочисленных значений. Для этого есть две причины:
В первые дни C все аргументы были переведены в int (прототипы функций не существовали).
Для согласованности эти функции должны обрабатывать случай EOF, который по понятным причинам не может быть значением, представляемым char
, поскольку это будет означать, что нам придется потерять одну из законных кодировок для персонажа.
http://en.cppreference.com/w/cpp/string/byte/tolower
Ответ заключается в приведении результата к символу перед печатью.
например.:
std::cout << static_cast<char>(std::to_lower('A'));