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

#include <stdio.h> int my_length(char c[]) { int len = 0; int i = 0; while (c[i] != '\0') { len++; i++; } return len; } int is_same(char *s1, char *s2) { int i = 0; int len1 = my_length(s1); int len2 = my_length(s2); while (*s1 != '\0' && *s2 != '\0') { if (s1[i] != s2[i]) { return i; } i++; } if (len1 == len2) { return -1; } if (len1 < len2) { return len1; } if (len1 > len2) { return len2; } return 0; } int main() { char a1[1001], a2[1001]; int i1 = 0, i2 = 0; char b; while (i1 < 1000 && (b = getchar()) != '\n') { a1[i1] = b; i1++; } a1[i1] = '\0'; while (i2 < 1000 && (b = getchar()) != '\n') { a2[i2] = b; i2++; } a2[i2] = '\0'; printf("%d", is_same(a1, a2)); return 0; }
这段代码的功能是比较两个字符串,并返回它们第一个不同字符的位置(从0开始计数)。如果两个字符串完全相同,则返回-1。如果其中一个字符串是另一个的前缀,则返回较短字符串的长度。

代码中存在一个逻辑错误,导致比较结果不正确。

- 在 `is_same` 函数中,你同时使用了指针 `*s1` 和 `*s2` 来检查循环条件,但又用索引 `s1[i]` 和 `s2[i]` 来访问字符。这两种方式混用会导致指针没有正确移动,循环条件可能提前结束或无限循环。你应该统一使用一种方式,要么全部用指针移动,要么全部用索引。
- 当发现字符不同时,你返回了 `i`,但此时 `i` 的值就是第一个不同字符的位置,这个逻辑本身是正确的。不过由于循环条件的问题,这个位置可能不是预期的结果。