2

我实现了 toUpper()。它不能 100% 工作。

代码 :

char* toUpper(char* string)
{
    char* sv = string;
    while(*sv++ != '\0')
    {
        if( int(*sv) >= 97 || int(*sv) <= 122)  //Only if it's a lower letter
            *sv = char( *sv - 32);
    }
    return string;
}

我知道小写字母的数字从 97 到 122(ASCII 格式),大写字母的数字从 65 到 90。从小写字母到大写字母之间正好有 32 个数字。所以我只是从较低的字符中减去了 32。

我调用此函数的代码:

char h[] = "Whats up?";
cout << toUpper(h) << endl;

我希望程序输出“WHATS UP?” 但相反,我得到了“什么”。我做错了什么?

4

3 回答 3

6
if( int(*sv) >= 97 || int(*sv) <= 122)

应该

if( int(*sv) >= 97 && int(*sv) <= 122)

或者,最好是

if( *sv >= 'a' && *sv <= 'z')
    *sv = *sv - ('a' - 'A');

您还需要移动您递增的点sv。当前代码跳过检查第一个字符string

while(*sv != '\0')
{
    if( *sv >= 'a' && *sv <= 'z')
        *sv = *sv - ('a' - 'A');
    sv++;
}

最后,我相信您已经知道了,但以防万一……如果这不是家庭作业或其他学习练习,标准的 C toupper函数将为您完成完全相同的工作

*sv = (char)toupper(*sv);
于 2013-06-03T16:23:03.453 回答
2

同时使用 ++ 会让您错过重要的案例。int() 东西是不必要的噪音。你需要 && 在检查条件。动作可以用 -= 来写。

于 2013-06-03T16:29:31.197 回答
1

这是一个重写,它使用一个 for 循环并修复你的条件以及非一个增量:

char* toUpper(char* string)
{
    for(char* p=string; *p != '\0'; p++)
    {
        if(*p >= 'a' && *p <= 'z')  //Only if it's a lower letter
          *p -= 32;
    }
    return string;
}
于 2013-06-03T16:30:54.550 回答