5

我有一个char foo[SIZE]; //(string)

并使用正确输入%s(如printfs正确输入),但现在想将其设置为小写。所以我尝试使用

 if (isupper(*foo)) 
   *foo=tolower(*foo); 

即当我这样做时:

printf("%s" foo); //I get the same text with upper case

文本似乎没有改变。谢谢你。

4

3 回答 3

5

foo不是指针,因此您不想将其用作指针。您也不必在使用前检查字符是否为大写字母tolower——它将大写转换为小写,其他字符保持不变。你可能想要这样的东西:

for (i=0; foo[i]; i++)
    foo[i] = tolower((unsigned char)foo[i]);

请注意,当您调用tolower(和toupperisalpha等)时,您确实需要将输入转换为unsigned char. 否则,基本英语/ASCII 字符集之外的许多(大多数?)字符将经常导致未定义的行为(例如,在典型情况下,大多数重音字符将显示为负数)。

顺便说一句,当您读取字符串时,您不想使用scanfwith %s-- 您总是想指定字符串长度,例如: scanf("%19s", foo);,假设SIZE== 20 (即,您希望指定比大小。或者,您可以使用fgets, like fgets(foo, 20, infile);。请注意,使用fgets,您指定缓冲区的大小,而不是像使用scanf(和 fscanf 之类的公司)那样少一个。

于 2013-06-04T03:27:36.507 回答
3

尝试这个

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}
于 2013-06-04T03:25:53.637 回答
3

*foo=tolower(*foo); //doing *(foo+i) or foo[i] does not work either

因为所有这些选项都没有意义

你应该像这样使用它:

for(i = 0; foo[i] != '\0'; i++){
    foo[i] = tolower(foo[i]);
}
于 2013-06-04T03:26:09.193 回答