C «toupper» не преобразует символ в верхний регистр

#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';