Online Compiler 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 = s[i], last = first; 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; }
这段代码试图统计字符串中首尾字母相同的单词个数。它从标准输入读取一行文本,然后遍历每个字符,当遇到单词开头时,记录第一个字母,再找到该单词的最后一个字母,比较它们是否相同。

代码中存在逻辑错误,导致计数不准确。

- 在内部循环中,变量 `last` 被不断更新,但循环结束后 `last` 保存的是单词的最后一个字符,而 `first` 在外部循环中可能被后续字符覆盖,导致比较的不是同一个单词的首尾字母。
- 当 `i` 指向单词的第一个字母时,`first` 被正确赋值,但外部循环继续执行时,`first` 会被后续字符覆盖,而内部循环只在单词开头执行一次,后续字符的 `first` 可能已经不是该单词的首字母了。

提示:
- 思考一下,当 `i` 指向单词的第一个字母时,如何确保 `first` 和 `last` 对应的是同一个单词,并且只在单词结束时进行比较?
- 注意内部循环结束后,`i` 的位置在哪里?外部循环的 `i++` 是否会导致跳过某些字符?