Online Compiler C

#include <stdio.h> int main() { char a[1001] = {0}, b[1001] = {0}; int len1 = 0, len2 = 0; scanf("%s%s", a, b); for (int i = 0; a[i] != '\0'; i++) { len1++; } for (int i = 0; b[i] != '\0'; i++) { len2++; } if (len1 <= len2) { for (int i = 0; i < len1; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } } if (len1 < len2) printf("%d", len1); return 0; } else if (len1 > len2) { for (int i = 0; i < len2; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } } printf("%d", len2); return 0; } printf("%d", -1); return 0; }
这段代码比较两个字符串,并输出它们第一个不同字符的位置(从0开始计数)。如果其中一个字符串是另一个的前缀,则输出较短字符串的长度。如果两个字符串完全相同,则输出-1。

代码逻辑基本正确,但有一个边界情况可能没有处理好。

- 当两个字符串长度相等且完全相同时,代码会进入 `len1 <= len2` 的分支,循环结束后没有进入 `if (len1 < len2)` 的条件,所以会执行最后的 `printf("%d", -1)`,这部分是正确的。

- 但考虑一种情况:两个字符串长度相等,且所有字符都相同,此时循环结束后,`len1` 等于 `len2`,所以不会输出 `len1`,而是会执行最后的 `-1`。这符合预期。

- 主要问题在于:当 `len1` 和 `len2` 相等时,代码进入了 `len1 <= len2` 分支,但循环结束后,如果 `len1 == len2`,它不会输出 `len1`,而是会继续执行到最后的 `-1`。这本身没问题。但仔细看,当 `len1 == len2` 且所有字符都相同时,循环结束后,程序会执行 `return 0` 吗?不会,因为 `if (len1 < len2)` 不成立,所以会跳过,然后执行 `return 0` 吗?实际上,在 `if (len1 < len2)` 之后有一个 `return 0`,这个 `return 0` 是紧跟在 `if` 块后面的,所以无论条件是否成立,都会执行这个 `return 0`。也就是说,当 `len1 == len2` 且所有字符相同时,循环结束后,会执行 `if (len1 < len2)` 判断为假,然后执行 `return 0`,程序结束,不会输出 `-1`。这就错了,因为两个完全相同的字符串应该输出 `-1`。

- 提示:注意 `if (len1 < len2)` 后面的 `return 0` 的位置。这个 `return 0` 是否应该只在 `len1 < len2` 成立时执行?还是说它应该属于整个 `if` 结构之外?检查一下花括号的配对和代码的执行流程。