在线编译器 C

#include <stdio.h> int my_strlen(char s[]) { int i = 0; while (s[i] != '.' && s[i] != '\n' && s[i] != '\0') { i++; } return i; } int my_strcmp(char a[], char b[]) { int i = 0; int dif = 0; while (a[i] != '.' && b[i] != '.' && a[i] != '\n' && b[i] != '\n' && a[i] != '\0' && b[i] != '\0') { dif = a[i] - b[i]; if (dif < 0) { return -1; } if (dif > 0) { return 1; } i++; } int size_a = my_strlen(a); int size_b = my_strlen(b); if (size_a == size_b) { return 0; } if (size_a > size_b) { return 1; } if (size_a < size_b) { return -1; } } int main() { char a[6] = "asass."; char b[5] = "asas."; printf("%d", my_strcmp(a, b)); return 0; }
这段代码实现了一个自定义的字符串比较函数 `my_strcmp`,以及一个辅助函数 `my_strlen`。`my_strlen` 计算字符串长度时遇到 `.`、换行符或空字符停止。`my_strcmp` 逐字符比较两个字符串,遇到 `.`、换行符或空字符时停止,然后根据剩余长度决定大小关系。`main` 函数中测试了两个以 `.` 结尾的字符串。

- 你的 `my_strcmp` 在循环结束后,用 `my_strlen` 计算长度时,`my_strlen` 也会在遇到 `.` 时停止,所以 `size_a` 和 `size_b` 实际上只计算到 `.` 之前的字符数。这可能导致比较结果不符合预期,因为循环已经比较了 `.` 之前的所有字符,而长度比较又基于同样的范围,所以当循环内字符都相等时,长度也必然相等,最终总是返回0。你需要思考如何区分字符串在 `.` 之后还有内容的情况。

- 另外,`main` 函数中数组 `a` 和 `b` 的大小分别是6和5,但字符串内容加上结尾的 `.` 和空字符正好占满,这没问题。但注意你的 `my_strcmp` 循环条件中同时检查两个字符串的终止符,如果其中一个字符串先遇到终止符而另一个还没到,循环会提前退出,但后续的长度比较可能无法正确反映这种提前结束的情况。