在线编译器 C

#include <stdio.h> int main() { char s[1001] = {0}; fgets(s, sizeof(s), stdin); int count = 0,i,j; for (i = 0; s[i] != '\0'; i++) { char first; if (i == 0 || s[i - 1] == ' ') { first = s[i]; for (j = i; s[j] != ' '; j++) { if (s[j] == '\0') break; } if (first == s[j-1]) count++; } } printf("%d", count); return 0; }
这段代码的功能是统计输入字符串中,首尾字母相同的单词个数。它遍历字符串,当遇到单词开头(即字符串开头或前一个字符是空格)时,记录该单词的首字母,然后找到单词的结尾(空格或字符串结束),再比较首字母和最后一个字母是否相同。

代码存在一个潜在问题:当单词结尾是字符串结束符 `\0` 时,内层循环会因 `break` 退出,但此时 `j` 指向的是 `\0` 的位置,而 `s[j-1]` 才是单词的最后一个字母,这个逻辑是正确的。但需要注意,如果单词后面紧跟空格,内层循环会在遇到空格时停止,此时 `j` 指向空格,`s[j-1]` 是单词最后一个字母,也是正确的。

- 检查内层循环的边界条件:当字符串末尾没有空格时,内层循环通过 `break` 退出,此时 `j` 指向 `\0`,`s[j-1]` 是最后一个字母,逻辑正确。但考虑一下,如果单词后面有多个空格,内层循环会在第一个空格处停止,这没问题,因为单词只包含非空格字符。

- 思考一下:如果输入字符串以空格开头,代码中 `i == 0` 的条件会错误地将开头的空格视为单词开头吗?实际上,`i == 0` 时,如果第一个字符是空格,`first` 会被赋值为空格,但后续内层循环会立即遇到空格或结束,导致 `first` 和 `s[j-1]` 都是空格,从而错误地计数。需要检查这种情况。