在线编译器 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; a[i] != '\0'; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } } printf("%d", len1); return 0; } else if (len1 > len2) { for (int i = 0; b[i] != '\0'; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } } printf("%d", len2); return 0; } for (int i = 0; a[i] != '\0'; i++) { if (a[i] != b[i]) { printf("%d", i); return 0; } } printf("%d", -1); return 0; }
这段代码的功能是比较两个字符串,并输出它们第一个不同字符的位置(从0开始计数)。如果两个字符串完全相同,则输出-1。代码通过手动计算字符串长度,然后根据长度关系分情况比较。

- 代码中手动计算字符串长度的部分可以用标准库函数 `strlen` 替代,但这不是主要问题。注意在比较时,当长度不同时,你只比较了较短字符串的长度范围,但输出位置时需要考虑:如果较短字符串完全匹配较长字符串的前缀,应该输出较短字符串的长度(即第一个超出范围的位置)。这个逻辑是正确的。

- 一个潜在的问题是:当两个字符串长度相等时,你单独写了一个循环,这个循环其实可以合并到前面的分支中。但这不是错误,只是代码冗余。

- 主要需要检查的是:当长度不同时,你输出的是较短字符串的长度,但题目要求的是第一个不同字符的位置。如果较短字符串是较长字符串的前缀,那么第一个不同位置就是较短字符串的长度,这符合逻辑。但注意,如果两个字符串长度不同且在前缀中就有不同字符,你的代码会正确输出那个位置。所以逻辑上没有问题。

- 不过,你的代码中有一个小细节:在长度不同的分支里,你用了 `a[i] != '\0'` 或 `b[i] != '\0'` 作为循环条件,这实际上等价于 `i < len1` 或 `i < len2`,但更清晰的方式是直接用长度变量控制循环。当前写法虽然正确,但容易让人误解。

- 另外,注意数组大小是1001,但输入字符串可能超过这个长度吗?题目没有说明,但通常这种题目会保证不超过1000个字符,所以1001是安全的。

总的来说,代码逻辑正确,但可以更简洁。没有明显的错误。