在线编译器 C

#include <stdio.h> int main() { char s[1001]; fgets(s,1001,stdin); int l=0; while(s[l]!='\0') l++; if(s[l-1]=='\n') s[l-1]='\0'; int cnt=0; int i=0; char first, last; while(s[i]!='\0') { while(s[i]==' '&&s[i]!='\0') i++; if(s[i]!='\0') { first=s[i]; last=s[i]; while(s[i]!=' '&&s[i]!='\0') { last=s[i]; i++; } char f_low=first; if(f_low>='A'&&f_low<='Z') f_low+=32; char l_low=last; if(l_low>='A'&&l_low<='Z') l_low+=32; if(f_low==l_low) cnt++; } } printf("%d",cnt); return 0; }
这段代码的功能是:读取一行字符串,统计其中首字母和尾字母相同(忽略大小写)的单词个数。

代码逻辑是:
- 用 fgets 读入一行字符串
- 手动计算字符串长度并去除末尾换行符
- 遍历字符串,用两个嵌套循环来识别每个单词
- 对每个单词,记录第一个字符和最后一个字符,都转成小写后比较
- 如果相等,计数器加1

代码中存在一个问题:当字符串中有连续空格时,内层循环处理完一个单词后,外层循环会继续,但此时 i 可能已经指向了单词后的空格,而内层循环会跳过这些空格。然而,如果字符串末尾有空格,或者单词之间只有一个空格,逻辑是正常的。但有一个边界情况需要注意:如果字符串以空格开头,第一个 while 循环会跳过开头的空格,但之后如果遇到连续空格,内层循环会正确跳过。不过,代码中有一个潜在的错误:在跳过空格的 while 循环中,条件 `while(s[i]==' '&&s[i]!='\0')` 是正确的,但要注意,如果字符串全是空格,这个循环会一直走到末尾,然后 `if(s[i]!='\0')` 会跳过,不会出错。

- 提示1:检查当字符串中有连续多个空格时,代码是否能正确处理。例如输入 "a   b" 时,单词 "a" 之后有两个空格,内层循环跳过空格后,i 指向 'b',但此时外层循环的 while 条件会再次进入,内层跳过空格的循环会跳过这些空格,然后处理 'b'。但注意,在跳过空格的循环中,如果遇到字符串结束符 '\0',循环会停止,但此时 i 指向 '\0',外层循环的 while 条件会退出。所以逻辑上似乎没问题。但有一个细节:在跳过空格的循环中,条件 `while(s[i]==' '&&s[i]!='\0')` 中,如果 s[i] 是空格,循环继续,但循环体只有 i++,没有检查 i 是否越界。实际上,因为字符串有 '\0' 结尾,当 i 到达 '\0' 时,条件 `s[i]==' '` 为假,循环退出,所以不会越界。所以这个部分是正确的。

-