在线编译器 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[i] != '\0' && s2[i] != '\0') { if (s1[i] != s2[i]) { return i; } i++; } if (len1 == len2) { return -1; } if (len1 < len2) { return len1; } return len2; } 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` 函数中,当两个字符串长度不同且其中一个为另一个的前缀时,你返回了较短字符串的长度。但题目可能要求返回的是第一个不同字符的位置,对于前缀情况,这个位置应该是较短字符串的长度(即第一个超出较短字符串的位置)。你的实现符合这个逻辑。

- 不过,你的 `is_same` 函数在循环结束后,用 `len1` 和 `len2` 比较来处理前缀情况,这个思路是对的。但要注意,当 `len1 == len2` 时返回 -1,这表示完全相等,没有问题。

- 一个潜在的问题是:如果两个字符串在某个位置不同,你返回了那个位置 `i`,这符合要求。但注意,你的循环条件 `s1[i] != '\0' && s2[i] != '\0'` 在遇到不同字符时就会返回,所以不会越界。

- 另外,你的 `my_length` 函数正确计算了字符串长度。

整体来看,代码功能正确。但你可以思考一下:如果输入的两个字符串中有一个是空字符串(即直接换行),你的代码会如何处理?当前代码中,如果第一个输入是空行,`a1[0]` 会被设为 `'\0'`,长度0,比较时可能返回0,这是合理的。但你可以测试一下边界情况。