在线编译器 C

#include <stdio.h> #include <string.h> int main(void) { char s1[1001], s2[1001]; fgets(s1, sizeof(s1), stdin); fgets(s2, sizeof(s2), stdin); size_t len1 = strlen(s1); if (len1 > 0 && s1[len1 - 1] == '\n') s1[--len1] = '\0'; size_t len2 = strlen(s2); if (len2 > 0 && s2[len2 - 1] == '\n') s2[--len2] = '\0'; size_t min_len = (len1 < len2) ? len1 : len2; int pos = -1; for (size_t i = 0; i < min_len; ++i) { if (s1[i] != s2[i]) { pos = (int)i; break; } } if (pos == -1 && len1 != len2) { pos = (int)min_len; } printf("%d\n", pos); return 0; }
这段代码的功能是比较两个字符串,找出它们第一个不相同字符的位置(从0开始计数)。如果两个字符串完全相同,则输出-1;如果一个是另一个的前缀(比如"abc"和"abcd"),则输出较短字符串的长度。

你的代码逻辑基本正确,但有一个边界情况可能没有处理好。

- 当两个字符串完全相等时,循环结束后pos仍然是-1,且len1等于len2,所以不会进入第二个if,输出-1,这是正确的。
- 当一个是另一个的前缀时,循环结束后pos仍然是-1,但len1不等于len2,所以会输出min_len,这也是正确的。
- 当两个字符串在某个位置不同时,会输出那个位置,这也是正确的。

不过,你的代码中有一个潜在问题:如果两个字符串完全相同,但长度不同(比如"abc"和"abc ",注意末尾有空格),这种情况实际上不会发生,因为fgets会读取换行符,而你已经去掉了换行符。但更关键的是,你的代码没有处理两个字符串完全相等且长度相等的情况,此时输出-1是正确的。

实际上,你的代码已经能处理大部分情况。但有一个细节:如果两个字符串在某个位置不同,但其中一个字符串比另一个短,且短的那个字符串恰好是长字符串的前缀,那么你的代码会输出min_len,而不是那个不同的位置。例如s1="ab", s2="abc",你的代码输出2,这是正确的,因为前两个字符相同,第三个字符s1没有,所以第一个不同位置是2。但如果s1="ab", s2="ac",你的代码会输出1,因为第一个不同位置是索引1,这也是正确的。

所以你的代码逻辑基本正确。不过,有一个边界情况:如果两个字符串完全相同,但长度不同,且短的那个字符串不是长字符串的前缀(这不可能,因为如果短的是前缀,那么它们的前min_len个字符相同),所以你的代码没有问题。

实际上,你的代码有一个小问题:当两个字符串完全相同且长度相等时,pos保持-1,输出-1,正确。当两个字符串完全相同但长度不等时,pos保持-1,进入第二个if,输出min_len,正确。当有不同字符时,输出第一个不同位置,正确。

所以你的代码看起来是正确的。但为了更严谨,你可以考虑一下:如果两个字符串都是空字符串(即只输入了换行符,被去掉