在线编译器 C

#include <stdio.h> char to_lower_manual(char c) { if (c >= 'A' && c <= 'Z') { return c + ('a' - 'A'); } return c; } int main() { char s[1001]; fgets(s, sizeof(s), stdin); int len = 0; while (s[len] != '\0') len++; if (len > 0 && s[len - 1] == '\n') { s[len - 1] = '\0'; len--; } int count = 0; int i = 0; while (s[i] != '\0') { while (s[i] == ' ') i++; if (s[i] == '\0') break; char first = s[i]; while (s[i] != ' ' && s[i] != '\0') i++; char last = s[i - 1]; if (to_lower_manual(first) == to_lower_manual(last)) { count++; } } printf("%d\n", count); return 0; }
这段代码的功能是:读取一行字符串,统计其中首尾字符(忽略大小写)相同的单词个数。它通过手动遍历字符串来识别单词,并比较每个单词的第一个和最后一个字符。

- 你的代码在读取字符串后,手动计算长度并移除末尾换行符,这部分是正确的。但要注意,`fgets` 本身会保留换行符,你的处理方式没问题。

- 在统计单词的循环中,你使用了两层 `while` 来跳过空格和遍历单词。但有一个潜在问题:当遇到连续空格时,内层循环结束后,外层循环会再次检查 `s[i]`,如果此时 `s[i]` 是空格,会再次进入内层循环跳过空格。这个逻辑看起来正确,但需要确认边界情况。

- 关键点在于:当字符串以空格结尾时,你的代码在跳过末尾空格后,`s[i]` 会是 `'\0'`,然后 `break` 退出,这没问题。但如果字符串末尾没有空格,最后一个单词结束后 `s[i]` 就是 `'\0'`,外层循环会正常结束。

- 你的代码中,`first` 和 `last` 的获取方式正确,但注意 `last` 是 `s[i-1]`,而 `i` 在遍历单词后指向了单词后的空格或 `'\0'`,所以 `i-1` 是单词最后一个字符,没问题。

- 一个可能的错误:如果字符串中有空单词(例如连续两个空格),你的代码会如何处理?实际上,内层循环跳过空格后,如果遇到 `'\0'` 就 `break`,所以不会处理空单词。但考虑一种情况:字符串开头就是空格,你的代码会先跳过这些空格,然后处理第一个单词,这没问题。

- 另一个需要注意的地方:你的 `to_lower_manual` 函数只处理大写字母,对于已经是小写或其他字符,直接返回原字符。这符合要求。

- 提示:检查当字符串中只有一个单词且没有空格时,你的代码是否能正确统计。另外,考虑字符串中单词之间可能有多个空格的情况,你的代码是否仍然正确。