我的xstrcmp(它是strcmp库函数的副本)给出了不正确的结果



编译器没有给出错误,但我没有得到自制strcmp函数所需的输出。

#include <stdio.h>
#include<string.h>

int main() {
char str1[20],str2[20];
gets(str1);
gets(str2);
printf("n%d",xstrcmp(str1,str2));
return 0;
}
int xstrcmp(char *p1,char *p2){
int k;
while(*p1!=''||*p2!=''){
if((*p1-*p2)==0){
p1++,p2++;
continue;
}
else{

k= ((*p1)-(*p2));
}
}
return k;
}

首先,请阅读以下内容:为什么gets函数如此危险,以至于不应该使用它?。因此,使用fgets(str1, 20, stdin)而不是gets(str1)行(同样用于读取str2)。其次,在使用xstrcmp之前,您应该真正提供它的原型(预声明);在main之前有一行类似的代码:int xstrcmp(char* p1, char* p2);(或者可以将该函数的整个部分移到main之前)。在您的情况下,由于编译器会假设它是一个返回int的函数,因此没有重大问题;但使用这种未声明的函数是不好的做法,而且(IIRC),该选项计划在未来的C标准中删除。

现在来谈谈函数中的逻辑问题:有两个。

  1. 如果while循环结束时没有发现不匹配(即,如果传递的字符串相同),则不会给k任何值;这是一个简单的修复:将k初始化为零,就像int k = 0;一样
  2. 发现不匹配时,既不会增加p1p2指针,也不会中断while循环——因此,一旦发现不匹配,循环将永远继续。要解决此问题,只需在else块中添加一个break;语句

以下是解决这些问题的代码的工作版本:

#include <stdio.h>
#include <string.h>
int xstrcmp(char* p1, char* p2); // Pre-declaration of the function
int main() {
char str1[20], str2[20];
fgets(str1, 20, stdin);
fgets(str2, 20, stdin);
printf("n%d", xstrcmp(str1, str2));
return 0;
}
int xstrcmp(char* p1, char* p2) {
int k = 0; // We need to give k a value to use if we complete the loop without a mismatch
while (*p1 != '' || *p2 != '') {
if ((*p1 - *p2) == 0) {
p1++, p2++;
continue;
}
else {
k = ((*p1) - (*p2));
break; // Once we find a mismatch, we must terminate the loop after assiging k
}
}
return k;
} 

注意:使用类似while (*p1 != '' && *p2 != '')的循环条件(使用&&而不是||)更为传统。然而,在您的情况下,内部循环逻辑(一旦纠正)将允许任何一个工作:任何不匹配都将停止(break)循环,如果字符串相同,则p1p2将同时指向nul字符,因此使用||的测试在预期时仍将失败。

最新更新