C语言中带for循环的toupper函数

C语言中带for循环的toupper函数,c,string,loops,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);

我不明白为什么下面的代码不能像我希望的那样工作

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);
}
谢谢

更换线路:

   toupper(sentence[i]);
关于这一点:

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

如果您不想修改字符串,只想以大写形式打印它,那么使用WolfieeifloW的解决方案

Edit:正如其他人指出的那样,
strlen
是一个缓慢的函数(它必须扫描整个字符串,因此需要
Θ(n)
时间),这里给出的解决方案将阻止编译器进行智能优化以对其进行一次评估。因此,最好是你自己预先评估一下,比如:

int len = strlen(sentence);

for (i=0; i<len; i++)
int len=strlen(句子);

对于(i=0;i尝试使用while循环:

int i = 0;    

while(sentence[i]) {
    putchar(toupper(sentence[i]));
    i++;
}
这也有助于避免计算每个循环的
语句[]
strlen

toupper(语句[i]);
不修改它的参数,而是返回它。因此,解决方案是用

句子[i]=toupper((无符号字符)句子[i]);

我还使用了一个
(unsigned char)
转换来实现可移植性(acknowledge@M.M)。(EBCDIC编码需要8位字母数字字符。)


也因为你正在改变<代码>句子< /代码>,我想地球上没有一个编译器会将“代码”> StLLN(句子)< /代码>的多个调用优化为一个调用。你的O(n)算法突然变成O(n*n)!考虑预先计算这个循环,或者使用< <代码>句子[I]来实现它。

作为停止表达式?(Acknowledge@nwellnhof)。

toupper
返回大写字母。您必须重新分配给源字符串:
句子[i]=toupper(句子[i]);
putchar(toupper(句子[i])
如果不再需要结果,则应为
toupper((无符号字符)句子[i])
,以防我们在EBCDIC上machine@M.M在EBCDIC机器上,通常不需要
无符号字符
,因为
字符
通常是无符号的。在其他机器上,如果
字符
有符号,则需要
(无符号字符)
cast.Upvoted。这更好:它避免了重复计算我提到的
strlen
。@redneb的答案更好,但我会把
putchar(toupper(句子[I]);
为什么不
用于(I=0;句子[I];I++)
?@WolfieeifloW-是的,有理由否决投票-尽管我没有。OP没有阅读toupper的手册页,这是一个致命错误。此代码修改了
句子[]
,当然,OP想要/需要。副作用是,代码无法优化对
strlen()的调用
并因此强制重复
strlen()
调用。结果:
O(n*n)
运行时。更改循环结束条件将有助于改进代码。
int i = 0;    

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