Онлайн компилятор C

#include <stdio.h> int main() { char a[1001] = {0}, b[1001] = {0}; scanf("%s%s", a, b); for (int i = 0; b[i] != '\0' || a[i] != '\0'; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } else if (a[i] == '\0' && b[i] == '\0') break; } printf("%d", -1); return 0; }
这段代码试图比较两个字符串,并输出它们第一个不同字符的位置(从0开始),如果完全相同则输出-1。但代码中存在一个逻辑问题。

- 循环条件 `b[i] != '\0' || a[i] != '\0'` 在其中一个字符串结束时仍会继续循环,这可能导致访问越界或误判。例如,当 `a` 比 `b` 短时,`a[i]` 可能为 `\0` 而 `b[i]` 不为 `\0`,此时循环仍会继续,但 `a[i]` 是 `\0`,`b[i]` 是有效字符,它们不相等,会错误地输出 `i` 作为不同位置。

- 当两个字符串长度不同时,第一个不同位置应该是较短字符串的结束位置(即 `\0` 与对应字符的比较),但代码中的 `else if` 条件 `a[i] == '\0' && b[i] == '\0'` 只在两者同时结束时才跳出,这无法正确处理长度不同的情况。