Online Compiler C

#include <stdio.h> int my_strlen(char s[]) { int j = 0; while (s[j] != '.' && s[j] != '\n' && s[j] != '\0') { j++; } return j; } 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[] = "asass."; char b[] = "asas."; printf("%d", my_strcmp(a, b)); return 0; }
这段代码实现了一个自定义的字符串比较函数 `my_strcmp`,以及一个辅助函数 `my_strlen` 来计算字符串长度。`main` 函数中用两个示例字符串测试比较结果。

代码的主要逻辑是逐个字符比较两个字符串,遇到句点、换行符或空字符时停止,然后根据比较结果返回 -1、0 或 1。但这里有几个需要注意的地方:

- 你的 `my_strcmp` 函数在比较时,停止条件同时检查了句点、换行符和空字符,但 `my_strlen` 函数也使用了同样的停止条件。这意味着你的字符串比较实际上只比较到第一个句点或换行符之前的部分,而不是整个字符串。这可能是你预期的行为吗?

- 在 `my_strcmp` 的 while 循环结束后,你通过比较两个字符串的长度来决定返回值。但这里有一个潜在问题:如果两个字符串在停止点之前完全相同,但其中一个字符串在停止点之后还有内容(比如一个字符串是 "abc.",另一个是 "abc"),你的长度比较会认为 "abc." 更长,从而返回 1。但按照常见的字符串比较逻辑,遇到句点应该视为字符串结束,所以 "abc." 和 "abc" 应该被认为是相等的。你的代码目前会认为它们不相等。

- 另外,`my_strcmp` 函数中 while 循环的条件使用了 `a[i] != '.' && b[i] != '.'`,这意味着如果其中一个字符串先遇到句点,循环会继续比较另一个字符串的对应位置,直到它也遇到句点或空字符。这可能导致比较越界,因为一个字符串可能已经结束,而另一个还在继续。