在线编译器 C

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

代码存在两个主要问题:

- 变量 `first` 和 `last` 只在 `if` 块内被赋值,但 `if` 块外的比较语句可能使用未初始化的值。当 `i` 不是单词开头时,`first` 和 `last` 的值是未定义的。

- 内层循环结束后,`last` 被更新为单词的最后一个字符,但外层循环的 `i` 会继续递增,导致同一个单词可能被多次处理,并且 `last` 的值会被后续字符覆盖。

提示:
- 考虑在找到单词开头后,用一个单独的循环或指针直接定位到单词末尾,然后比较首尾字母,再跳过整个单词。
- 注意变量的作用域和初始化时机,确保比较时使用的值是正确的。