我有一个char foo[SIZE]; //(字符串)
并且使用%s
正确输入了内容(如同它通过printf
打印正确的输入),但现在想将它转换为小写。所以我尝试使用
if (isupper(*foo))
*foo=tolower(*foo);
当我执行以下操作时:
printf("%s" foo); //I get the same text with upper case
这段文字似乎没有发生变化。谢谢。
foo
不是指针,所以您不应该将其用作指针。在使用tolower
之前,您也不必检查字符是否为大写字母--它会将大写字母转换为小写字母,并保留其他字符不变。您可能需要像这样的代码:
for (i=0; foo[i]; i++)
foo[i] = tolower((unsigned char)foo[i]);
tolower
(以及toupper
,isalpha
等)时,您确实需要将输入强制转换为unsigned char
。否则,许多(大多数?)基本英语/ ASCII字符集之外的字符经常会导致未定义的行为(例如,在典型情况下,大多数带重音符号的字符将显示为负数)。scanf
与%s
- 您总是要指定字符串长度,类似于:scanf("%19s",foo);
,假设SIZE
== 20(即,您想指定比大小小1)。或者,您可以使用fgets
,例如fgets(foo,20,infile);
。请注意,使用fgets
时,您需要指定缓冲区的大小,而不是像scanf
(以及像fscanf这样的函数)一样少一个。aside....
" part - Bill试试这个
for(i = 0; foo[i]; i++){
foo[i] = tolower(foo[i]);
}
foo[i]
的值为 false
。 - Billfoo[i] != '\0'
,但是不要使用 i <'\0'
。 - Bill*foo=tolower(*foo); //这里不能使用*(foo+i)或者foo[i],因为这些选项都没有意义。
正确的用法是:
for(i = 0; foo[i] != '\0'; i++){
foo[i] = tolower(foo[i]);
}
\0
?我认为 \0
更好,因为它是一个字符数组。 - Bill
isalpha
函数来移除非字母字符。 - squiguyisupper
和tolower
仅适用于单个字符,而非字符串。 - Yu Haofor
循环迭代字符串中的每个字符,请查看 https://dev59.com/v3E85IYBdhLWcg3wr1ge。 - Yu Hao