【发布时间】:2026-01-13 09:05:02
【问题描述】:
这是我在这里的第一个问题,所以我已尽我最大的努力使这个问题成为一个好问题。
我正在创建一个程序,它基本上接受用户输入并将所有字符转换为大写。我正在使用 for 循环使用相应的 ASCII 代码扫描小写字符。
我可以使用在代码中分配了字符串的字符数组来做到这一点:char text[] = "Text"。
我希望能够接受用户输入并在字符数组中使用它。我尝试使用getline(cin,myString) 并用它分配字符数组,但它说数组必须用大括号括起来的初始化程序进行初始化。
我保持字符数组未初始化,因为在初始化数组时 sizeof(text) 没有给出正确的大小。我正在阅读有关使用指针的信息,但我对该主题仍然有些新鲜。下面是我写的代码:
int main() {
// User input as a string
char textConvert[] = "This text will be converted to uppercase.";
cout << textConvert << endl;
int endChar = sizeof(textConvert); //Only gives correct size when array is uninitialized
for (int i = 0; i < endChar; i++) {
if (textConvert[i] >= 97 && textConvert[i] <= 122) {
textConvert[i] = textConvert[i] - 32;
}
}
cout << textConvert;
return 0;
}
【问题讨论】:
-
字符常量都有对应的字符码值。例如,如果您使用 ASCII
'a' == 97。无需自己编写数字常量。 -
sizeof(textConvert)不会像您认为的那样做。请改用strlen(textConvert)。 -
sizeof数组给出了整个数组的大小,而不仅仅是初始化部分的大小。您可能会想到std::strlen,尽管改用std::string会更容易。 -
你没有。我的意思是你不会硬编码 ASCII 字符,而是使用像
std::toupper这样的标准函数。你也不需要你的循环,但可以使用std::transform。最后,不要使用magic numbers。 -
如果您正在尝试编写生产质量的国际化案例转换例程,那简直就是一场噩梦。 1)在土耳其,“i”的大写形式不是“I”而是“İ”(“I”的小写形式是无点的-i。2)在德国,“Maße”的大写形式是“群众”(五个字符而不是四个)。 3)更糟的是,“MESSEN”的小写形式是“messen”,(所以你需要知道SS是ss还是ß)。 4) 更糟糕的是,“MASSE”的小写形式可以是“Maße”或“Masse”,具体取决于单词的含义(大写,因为它们是名词)。