C++ "toupper" 不将字符转换为大写
C++ "toupper" not converting character to uppercase
我正在尝试将字符串中的每个字母都转换为大写。我正在遍历每个字符并在其上使用 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;
}
}
std::toupper
returns 一个值而不是修改它的参数。所以你需要做:
str1[i] = std::toupper(str1[i]);
str2[i] = std::toupper(str2[i]);
为了实际修改字符串。
如果您打开警告,例如 -Wall
,编译器会告诉您您的代码版本无效。
您需要将修改后的字符串保存回 str 数组。像这样:
str[i] = toupper(str[i]);
在你的循环中,你不会改变字符串的元素,因为 toupper()
returns 一个新字符,它不会改变传递的字符。您需要使您的元素与返回的字符相同,如下所示:
for (int i = 0; i < len; i++) {
str1[i] = toupper(str1[i]);
str2[i] = toupper(str2[i]);
cout << str1[i] << " " << str2[i] << endl;
}
这可能会更好,具体取决于您的编码标准:
std::transform(str1.begin(), str1.end(), str1.begin(), std::toupper);
std::transform(str2.begin(), str2.end(), str2.begin(), std::toupper);
上面使用STL函数transform
将字符串全部转为大写
对于初学者来说,这个循环
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]
也不改变 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';
我正在尝试将字符串中的每个字母都转换为大写。我正在遍历每个字符并在其上使用 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;
}
}
std::toupper
returns 一个值而不是修改它的参数。所以你需要做:
str1[i] = std::toupper(str1[i]);
str2[i] = std::toupper(str2[i]);
为了实际修改字符串。
如果您打开警告,例如 -Wall
,编译器会告诉您您的代码版本无效。
您需要将修改后的字符串保存回 str 数组。像这样:
str[i] = toupper(str[i]);
在你的循环中,你不会改变字符串的元素,因为 toupper()
returns 一个新字符,它不会改变传递的字符。您需要使您的元素与返回的字符相同,如下所示:
for (int i = 0; i < len; i++) {
str1[i] = toupper(str1[i]);
str2[i] = toupper(str2[i]);
cout << str1[i] << " " << str2[i] << endl;
}
这可能会更好,具体取决于您的编码标准:
std::transform(str1.begin(), str1.end(), str1.begin(), std::toupper);
std::transform(str2.begin(), str2.end(), str2.begin(), std::toupper);
上面使用STL函数transform
将字符串全部转为大写
对于初学者来说,这个循环
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]
也不改变 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';