在char上使用toupper返回char的ascii号,而不是字符?

时间:2017-11-30 14:57:23

标签: c++

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顺序,而不是字符的大写/小写版本。无法弄清楚问题所在。有人可以告诉我为什么好吗?

(我可能还有其他问题,如果我有这个问题请不要纠正。我想自己解决(除了我解释的问题),但是我无法检查其他因为我有这个问题。

2 个答案:

答案 0 :(得分:6)

写作时

std::cout << toupper('a');

发生以下情况:

    调用
  1. int toupper(int ch),并返回一个值为'A'0x41)的整数。
  2. std::basic_ostream::operator<<(std::cout, 0x41)被调用,即int(2)重载,因为提供了int
  3. 总的来说,它打印“65”。

    作为解决方案,您可以将大写字母转换回char

    std::cout << static_cast<char>(toupper('a'));
    

答案 1 :(得分:2)

这是一个代表问题。字符与该字符的数值之间没有区别。它是你选择如何显示它的全部内容。例如,字符&#39; a&#39;只是一个常量,其值等于字符的数值。

您遇到的问题是std::toupperstd::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数组。另外,请注意,如果输入字符串不包含@,则您具有未定义的行为。