今天,我试图用C编写一个简单的“程序”,我想执行以下操作:当您输入大写字符串时,该程序会将所有字符转换为小写。但是我感到好奇。

char uppword[26];
int i;
printf("Gimme a word in uppercase.: ");
scanf("%s", uppword);
for (i=0; i < uppword[i]; i++){
    uppword[i] = uppword[i] + 32;
}

printf("%s", uppword);

return 0;

如您所见,在for循环中有一个条件i < uppword[i],但我不知道为什么会这样。以其他方式,我可以用i < strlen(uppword)代替此条件,它也将起作用。但是我不认为这与数组相同。为什么这个数组起作用?数组中的“i”以0开头,因此条件不是TRUE,因此无法继续处理。

最佳答案

字符串末尾的uppword[i]将为0(除非您尝试读取太多字符,否则编译器可能会吞下猫,否则scanf会为您完成此操作)。那时i < 0将为0。在某些假设的前提下,仅在那时是0:这些假设是:(i)uppword最多少于32个字符(您允许25个字符加上一个nul终止符),以及(ii)至少ASCII码通常不会遇到少于32个字符(因为它们是控件集)。

聪明,如果有点难读。

聪明的alec程序员可能还想考虑以下事实:该代码采用ASCII编码,因此不是可移植的C。

考虑改用strlen,但要预先计算:不要将它作为条件循环包含,否则您将把O(N)进程转换为O(N * N)进程-只有神性的编译器才能知道假设您的循环主体对字符串进行了更改,则strlen在两次迭代之间不会改变。

10-08 19:52