#c #string #for-loop #char #toupper
#c #строка #for-цикл #символ #toupper
Вопрос:
Я пытаюсь преобразовать каждую букву в строке в верхний регистр. Я перебираю каждый символ и использую toupper
для него. Однако, когда я печатаю новую строку, она не работает. Извините, если это вопрос новичка. Любая помощь была бы с благодарностью принята 🙂
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string str1, str2;
cin >> str1 >> str2;
int len = str1.size();
for (int i = 0; i < len; i ) {
toupper(str1[i]);
toupper(str2[i]);
cout << str1[i] << " " << str2[i] << endl;
}
}
Комментарии:
1. Примечание сбоку:
toupper
получает и возвращаетint
, поэтому обратите внимание на предупреждение в разделе Примечания на странице документации по ссылке.2. Найдите в Интернете «c transform toupper».
Ответ №1:
std::toupper
возвращает значение, а не изменяет его аргумент. Итак, вам нужно сделать:
str1[i] = std::toupper(str1[i]);
str2[i] = std::toupper(str2[i]);
для того, чтобы фактически изменить строки.
Если вы включите предупреждения, например, с помощью -Wall
, компилятор сообщит вам, что ваша версия кода не имеет никакого эффекта.
Ответ №2:
Это может быть лучше, в зависимости от ваших стандартов кодирования:
std::transform(str1.begin(), str1.end(), str1.begin(), std::toupper);
std::transform(str2.begin(), str2.end(), str2.begin(), std::toupper);
В приведенном выше примере используется функция STL transform
для преобразования всей строки в верхний регистр.
Ответ №3:
Вам нужно сохранить измененные строки обратно в массивы str. Что-то вроде этого:
str[i] = toupper(str[i]);
Ответ №4:
В вашем цикле вы не изменяете элементы строк, потому что toupper()
возвращает новый символ, он не изменяет переданный символ. Вам нужно, чтобы ваши элементы совпадали с возвращаемыми символами, следующим образом:
for (int i = 0; i < len; i ) {
str1[i] = toupper(str1[i]);
str2[i] = toupper(str2[i]);
cout << str1[i] << " " << str2[i] << endl;
}
Ответ №5:
Для начала этот цикл
for (int i = 0; i < len; i ) {
toupper(str1[i]);
toupper(str2[i]);
cout << str1[i] << " " << str2[i] << endl;
}
может вызывать неопределенное поведение, поскольку строки str1
и str2
в целом могут иметь разную длину.
Эти вызовы
toupper(str1[i]);
toupper(str2[i]);
не имеет никакого эффекта, потому что они не изменяют ни str1[i]
no str2[i]
.
Также вам необходимо преобразовать аргумент вызова toupper
в тип unsigned char
.
Вы могли бы отдельно выводить каждую строку следующим образом
for ( unsigned char c : str1 )
{
std::cout << ::toupper( c );
}
std::cout << ' ';
for ( unsigned char c : str2 )
{
std::cout << ::toupper( c );
}
std::cout << 'n';