int main()
{
char hmm[1000];
cin.getline(hmm, 1000);
cout << hmm << endl; //this was to test if I could assign my input to the array properly
for (int sayac = 0; hmm[sayac] != '@'; sayac++) {
if (!isdigit(hmm[sayac])) {
if (islower(hmm[sayac]))
cout << toupper(hmm[sayac]);
else if (isupper(hmm[sayac]))
cout << tolower(hmm[sayac]);
else
cout << hmm[sayac];
}
}
&#34;编写一个程序,读取@符号的键盘输入并回显输入 除了数字,将每个大写字符转换为小写,反之亦然。 (不要忘记cctype系列。)&#34;
我正在从入门书中做这个练习。但是当我运行它时,它返回char的ascii顺序,而不是字符的大写/小写版本。无法弄清楚问题所在。有人可以告诉我为什么好吗?
(我可能还有其他问题,如果我有这个问题请不要纠正。我想自己解决(除了我解释的问题),但是我无法检查其他因为我有这个问题。
答案 0 :(得分:6)
写作时
std::cout << toupper('a');
发生以下情况:
int toupper(int ch)
,并返回一个值为'A'
(0x41
)的整数。std::basic_ostream::operator<<(std::cout, 0x41)
被调用,即int
(2)重载,因为提供了int
。总的来说,它打印“65”。
作为解决方案,您可以将大写字母转换回char
:
std::cout << static_cast<char>(toupper('a'));
答案 1 :(得分:2)
这是一个代表问题。字符与该字符的数值之间没有区别。它是你选择如何显示它的全部内容。例如,字符&#39; a
&#39;只是一个常量,其值等于字符的数值。
您遇到的问题是std::toupper
和std::tolower
会返回int
而不是char
。其中一个原因是它们处理EOF
值,这些值不一定由char
表示。因此,std::cout
看到您正在尝试打印int
而不是char
。流式传输int
的标准行为是打印该号码。然后解决方案是将结果转换为char
以强制将值解释为字符。您可以使用类似std::cout << static_cast<char>(std::toupper(hmm[sayac]));
的内容。
尝试以下方法:
#include <cctype>
#include <iostream>
int main()
{
char hmm[1000];
std::cin.getline(hmm, 1000);
std::cout << hmm << std::endl; //this was to test if I could assign my input to the array properly
for (int sayac = 0; hmm[sayac] != '@'; sayac++) {
if (!std::isdigit(hmm[sayac])) {
if (std::islower(hmm[sayac]))
std::cout << static_cast<char>(std::toupper(hmm[sayac]));
else if (isupper(hmm[sayac]))
std::cout << static_cast<char>(std::tolower(hmm[sayac]));
else
std::cout << hmm[sayac];
}
}
}
您还应该考虑使用std::string
而不是任意长度的char
数组。另外,请注意,如果输入字符串不包含@
,则您具有未定义的行为。