如何将字符串转换为小写字母

5

我有一个char foo[SIZE]; //(字符串)

并且使用%s正确输入了内容(如同它通过printf打印正确的输入),但现在想将它转换为小写。所以我尝试使用

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

当我执行以下操作时:
printf("%s" foo); //I get the same text with upper case

这段文字似乎没有发生变化。谢谢。


你可以使用isalpha函数来移除非字母字符。 - squiguy
1
isuppertolower仅适用于单个字符,而非字符串。 - Yu Hao
@余浩,那么无法将其应用于字符串吗? - user2450044
你需要使用 for 循环迭代字符串中的每个字符,请查看 https://dev59.com/v3E85IYBdhLWcg3wr1ge。 - Yu Hao
3个回答

5

foo不是指针,所以您不应该将其用作指针。在使用tolower之前,您也不必检查字符是否为大写字母--它会将大写字母转换为小写字母,并保留其他字符不变。您可能需要像这样的代码:

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

请注意,当您调用tolower(以及toupperisalpha等)时,您确实需要将输入强制转换为unsigned char。否则,许多(大多数?)基本英语/ ASCII字符集之外的字符经常会导致未定义的行为(例如,在典型情况下,大多数带重音符号的字符将显示为负数)。
另外,当您读取字符串时,不要使用scanf%s - 您总是要指定字符串长度,类似于:scanf("%19s",foo);,假设SIZE == 20(即,您想指定比大小小1)。或者,您可以使用fgets,例如fgets(foo,20,infile);。请注意,使用fgets时,您需要指定缓冲区的大小,而不是像scanf(以及像fscanf这样的函数)一样少一个。

+1 for the "aside...." part - Bill

3

试试这个

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}

1
for循环中的foo[i]是什么意思?这类似于i<foo吗? - user2450044
@user2450044,你的字符数组应该以 null 结尾...然后当到达数组结尾时,foo[i] 的值为 false - Bill
@user2450044 你可以使用 foo[i] != '\0',但是不要使用 i <'\0' - Bill

3

*foo=tolower(*foo); //这里不能使用*(foo+i)或者foo[i],因为这些选项都没有意义。

正确的用法是:

for(i = 0; foo[i] != '\0'; i++){
    foo[i] = tolower(foo[i]);
}

中间的foo[i]是什么意思? - user2450044
NULL 还是 \0?我认为 \0 更好,因为它是一个字符数组。 - Bill
1
好的,现在给答案加上1 :) - Bill
@user2450044 你曾经读过关于C语言中的for循环的资料吗?认真点,得花些功夫啊... - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接