带有for循环的C中的toupper函数

时间:2016-09-21 13:43:36

标签: c string loops

我不明白为什么以下代码无法正常工作。

int main()
{
    char sentence[] = "this will be capitalised";
    int i;

    for (i=0; i<strlen(sentence); i++)
    {
        toupper(sentence[i]);
        putchar(sentence[i]);
    }

    printf("\n\n");

    return (0);
}

我最终得到了这个:

this will be capitalised

Program ended with exit code: 0

谢谢

3 个答案:

答案 0 :(得分:6)

替换行:

{
"af_status": "Non-organic",
"media_source": "tapjoy_int",
"campaign": "July4-Campaign",
"agency": "starcomm",
"af_siteid": null,
"af_sub1": "subtext1",
"af_sub2": null,
"af_sub3": null,
"af_sub4": null,
"af_sub5": null,
"freehand-param": "somevalue",
"click_time": "2014-05-23 20:11:31",
"install_time": "2014-05-23 20:12:16.751"
}

这一个:

   toupper(sentence[i]);

您的代码存在的问题是 sentence[i] = toupper(sentence[i]); 没有进行转换,而是将转换后的字母作为返回值返回。

如果您不想修改字符串,并且只想以大写形式打印,请使用WolfieeifloW的解决方案。

编辑:正如其他人所指出的那样,toupper功能很慢(它必须扫描整个字符串,因此需要strlen次)并且此处提供的解决方案将阻止编译器进行智能优化以对其进行一次评估。所以最好先评估你的自我,如下:

Θ(n)

答案 1 :(得分:5)

尝试使用while循环:

int i = 0;    

while(sentence[i]) {
    putchar(toupper(sentence[i]));
    i++;
}

这也有助于避免计算每个循环strlen的{​​{1}}。

答案 2 :(得分:5)

toupper(sentence[i]);不会修改其参数,但会返回它。因此,解决方案是用

替换循环体中的第一个语句

sentence[i] = toupper((unsigned char)sentence[i]);

我也为(unsigned char)演员提供了便携性(承认@ M.M)。 (EBCDIC编码需要8位字母数字字符。)

另外,因为你正在改变sentence,我想世界上没有任何编译器会优化strlen(sentence)对单个调用的多次调用。你的O(N)算法突然变成了O(N * N)!考虑预先计算它,向后运行循环,或使用sentence[i]作为停止表达式来获取它? (Acknowledge @nwellnhof)。