来自cctype函数的islower()在C ++中不起作用?

时间:2015-04-02 08:38:43

标签: c++

我必须编写一个程序来读取@符号的键盘输入并回显除数字之外的输入,将每个大写字符转换为小写,反之亦然。

到目前为止,这是我的代码:

#include <iostream>
#include <cctype>

using namespace std;



int main()
{
    char ch;

    cout << "Enter characters: " << endl;
    while (cin.get(ch))
    {
        if (ch == '@')
            break;
        if (isdigit(ch))
            continue;
        if (islower(ch))
            ch = toupper(ch);
        if (isupper(ch))
            ch = tolower(ch);
        cout << ch;


    }



    return 0;
}

我不知道我的代码有什么问题,但有些情况下,当我输入字符时,它只将大写字母转换为小写字母,而不是将小写字母转换为大写字母。 例如,我的输出是:

Enter characters: 
Hello       // my input
hello       // output

正如您所看到的,它只会将大写字母转换为小写字母,并且不会将任何小写字母转换为大写字母,就像它应该的那样。

我的代码有问题吗?如果有的话,我真的找不到它。 我是C ++的新手,我需要帮助。

提前致谢。

3 个答案:

答案 0 :(得分:3)

您将小写字母转换为大写,然后再将它们转换回来。您应该使用else if来避免不必要的判断:

if (islower(ch))
    ch = toupper(ch);
else if (isupper(ch))
    ch = tolower(ch);

答案 1 :(得分:2)

如果ch是小写字母,请在此处将其设为大写字母:

    if (islower(ch))
        ch = toupper(ch);

然后,因为ch刚刚转换为大写

    if (isupper(ch))      // <-- this is now true
        ch = tolower(ch); // <-- and this is now executed

您可以使用else解决此问题:

    if (islower(ch)) {
        ch = toupper(ch);
    } else if (isupper(ch)) {
        ch = tolower(ch);
    }
我扔了一些牙套,因为我喜欢牙套。当您想要向if语句的分支添加更多命令时,它们有助于避免错误。

答案 2 :(得分:1)

根据您的代码,当小写字母转换为大写时,它将转换为小写,因为它现在是一个大写字母。你应该这样做:

while (cin.get(ch))
{
    if (ch == '@')
        break;
    if (isdigit(ch))
        continue;
    if (islower(ch))
    {
        ch = toupper(ch);
        cout << ch;
        continue;
    }
    if (isupper(ch))
    {
        ch = tolower(ch);
        cout << ch;
    }
}

或者像这样:

while (cin.get(ch))
{
    if (ch == '@')
        break;
    else if (isdigit(ch))
        continue;
    else if (islower(ch))
        ch = toupper(ch);
    else if (isupper(ch))
        ch = tolower(ch);

    cout << ch;
}