为何该自定义C语言字符串比较函数无法正确判断两字符串是否相同?
啊,这个问题我当初刚学C的时候也踩过坑!核心问题出在你用sizeof来获取函数参数里数组的长度——这在C语言里是行不通的,原因是数组作为函数参数传递时会自动退化成指针。
咱们拆解一下问题:
- 当你把
char string0[]作为函数参数时,编译器实际上会把它当成char *string0来处理。这时候sizeof(string0)得到的是指针的大小(比如64位系统是8字节,32位是4字节),完全不是你传入的字符串的实际长度。所以你原来的长度判断逻辑完全失效了。 - 另外,你原来的代码里,只要长度相同就直接设
success=1,然后循环,但如果循环中发现字符不同,没有把success改回0,这也会导致错误(比如两个长度相同但内容不同的字符串会错误返回1)。
给你两个修正方案,取决于你的实际需求:
方案1:比较以'\0'结尾的标准字符串
这是最常见的场景,用strlen获取字符串有效长度(注意strlen不计算末尾的'\0'),然后逐字符比较:
#include <stdio.h> #include <string.h> // 必须包含这个头文件才能用strlen int compare_strings(char string0[], char string1[]) { // 先判断长度是否一致,不一致直接返回0 if (strlen(string0) != strlen(string1)) { return 0; } // 逐字符比较,直到遇到字符串结束符 for (int i = 0; string0[i] != '\0'; i++) { if (string0[i] != string1[i]) { return 0; // 发现不同字符立即返回 } } // 所有字符都匹配,返回1 return 1; } // 测试用例 int main() { char strA[] = "test"; char strB[] = "test"; char strC[] = "test1"; printf("strA vs strB: %d\n", compare_strings(strA, strB)); // 输出1 printf("strA vs strC: %d\n", compare_strings(strA, strC)); // 输出0 return 0; }
方案2:比较整个数组(包括'\0'之后的内容)
如果你的需求是比较固定长度的字符数组(而不是标准字符串),那必须额外传递数组的长度作为参数,因为函数无法从指针推断数组长度:
#include <stdio.h> int compare_char_arrays(char arr0[], char arr1[], int length) { for (int i = 0; i < length; i++) { if (arr0[i] != arr1[i]) { return 0; } } return 1; } int main() { char arrX[5] = {'a','b','c','d','e'}; char arrY[5] = {'a','b','c','d','e'}; char arrZ[5] = {'a','b','x','d','e'}; printf("arrX vs arrY: %d\n", compare_char_arrays(arrX, arrY, 5)); // 输出1 printf("arrX vs arrZ: %d\n", compare_char_arrays(arrX, arrZ, 5)); // 输出0 return 0; }
总结一下:在C语言里,永远不要试图用sizeof来获取函数参数中数组的长度,要么用strlen处理标准字符串,要么手动传递数组长度。
内容的提问来源于stack exchange,提问作者Hanlon
相关产品推荐
相关产品推荐

