Онлайн компилятор 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; } } 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开始计数)。如果其中一个字符串是另一个的前缀,则输出较短字符串的长度。

代码中存在一个逻辑错误,导致在某些情况下输出结果不正确。

- 当 `len1 >= len2` 时,循环条件 `i <= len2` 会导致循环多执行一次,访问到 `a[len2]` 和 `b[len2]`,而 `b[len2]` 是字符串结束符 `\0`。这会使程序在字符串完全相等或前缀匹配时错误地输出 `len2` 而不是 `len1`(当 `len1 > len2` 时)。
- 实际上,当 `len1 >= len2` 时,应该只比较到 `len2 - 1` 的位置,然后输出 `len2`。当前代码中循环多了一次,导致逻辑混乱。