Онлайн компилятор 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。

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

- 当两个字符串长度相等且完全相同时,代码会执行到最后的printf("%d", -1),这是正确的。
- 当len1等于len2且所有字符都相同时,第一个if内的循环结束后,由于len1不小于len2,不会进入内层if,也不会进入else if,所以会正确输出-1。
- 问题在于:当len1等于len2且所有字符都相同时,代码确实会输出-1,但仔细检查第一个if分支的逻辑:如果len1 <= len2成立,且循环中没有发现不同,那么如果len1 < len2会输出len1,但如果len1 == len2,则不会执行内层if,也不会执行else if,最终会执行最后的printf输出-1。这看起来没问题。

实际上,这段代码有一个潜在问题:当len1等于len2且所有字符都相同时,第一个if分支的循环结束后,由于len1不小于len2,不会进入内层if,也不会进入else if,所以会执行最后的printf输出-1,这是正确的。但代码中第一个if分支的条件是len1 <= len2,当len1等于len2时,它进入这个分支,循环结束后,由于len1 < len2不成立,所以不会输出len1,然后程序会继续执行到最后的printf输出-1。所以逻辑上似乎正确。

但有一个更隐蔽的问题:如果两个字符串完全相同且长度相等,代码会输出-1,这是符合预期的。但题目可能要求输出-1表示完全相同,所以没问题。

不过,代码中有一个冗余的else if (len1 > len2)分支,实际上可以用更简洁的方式处理。但这不是错误。

主要需要检查的是:当len1等于len2且所有字符都相同时,代码是否真的会输出-1?是的,会输出-1。

但有一个边界情况:如果len1等于len2且所有字符都相同,第一个if分支的循环结束后,由于len1 < len2不成立,不会输出len1,然后程序会跳过else if(因为len1 > len2不成立),最后执行printf("%d