自定义strcmp函数异常:相同字符串返回83而非0求助
自定义strcmp函数返回值异常的问题分析与修复
你写的xstrcmp函数在字符串完全相同时返回随机值(比如你遇到的83),问题出在循环逻辑上:
当两个字符串完全相等时,循环会持续执行到*s1和*s2都是字符串结束符'\0',此时*s1-*s2==0会触发循环体,执行*s1++和*s2++后,指针会指向'\0'后面的未知内存区域。退出循环后返回的*s1-*s2就是这块未知内存的值差,所以会得到随机结果。
修复后的代码
只需要在循环内判断当前字符是否为'\0',如果是就直接返回0,避免指针越界:
#include <stdio.h> int xstrcmp(char *, char*); int main() { int i; char string1[]="SUNDAY"; char string2[]="SUNDAY"; i=xstrcmp(string1,string2); printf("\n %d\n",i); return 0; } int xstrcmp(char *s1, char *s2) { while(*s1 == *s2) { // 到达字符串末尾,说明两串完全相等 if(*s1 == '\0') return 0; // 直接移动指针,无需解引用 s1++; s2++; } return *s1 - *s2; }
补充说明
- 原代码里的
*s1++属于冗余写法,我们只需要移动指针,不需要读取指针指向的值,直接写s1++更简洁。 - 修复后的逻辑完全符合标准strcmp的行为:相等返回0,s1对应字符的ASCII值更大返回正数,反之返回负数。
内容的提问来源于stack exchange,提问作者Vinayak Deshmukh
相关产品推荐
相关产品推荐

