我有这个赋值来实现strcmp函数。有时它运行正常,但有时它会崩溃。请帮帮我。
#include <iostream>
using namespace std;
int mystrcmp(const char *s1, const char *s2);
int main()
{
cout<<mystrcmp("A","A")<<endl;
cout<<mystrcmp("B","A")<<endl;
cout<<mystrcmp("A","B")<<endl;
cout<<mystrcmp("AB","A")<<endl;
return 0;
}
int mystrcmp(const char *s1, const char *s2)
{
while (*s1==*s2)
{
s1++;
s2++;
}
if(*s1=='\0')
return(0);
return(*s1-*s2);
}
答案 0 :(得分:10)
如果输入都相同,它将崩溃,因为你的循环继续超出终止nul
字符。
要解决此问题,您必须检查循环中的nul
字符 :
while (*s1==*s2) {
// if s1 points to nul character, then s2 should also, because of the ==
// which means we've reached the end of the strings and they are equal
// so return 0.
if(*s1=='\0')
return 0;
s1++;
s2++;
}
return *s1-*s2;
答案 1 :(得分:3)
你的mystrcmp
将很乐意在字符串的末尾运行,因为你对NUL终结符的测试是在循环之外。如果字符串相同,则*s1
和*s2
都为0,循环继续。
答案 2 :(得分:3)
while (*s1==*s2)
{
s1++;
s2++;
}
'\ 0'=='\ 0'
答案 3 :(得分:1)
如果你的两个字符串如下,你需要考虑会发生什么:
s1:this is a string\0|abcdef
s2:this is a string\0|abcdef
good memory <-|-> bad memory
因为你只是在内容相等的情况下推进指针,你最终可能会以未定义的方式读取内存。
更好的方法是基于以下伪代码的代码:
def strcmp(s1,s2):
while character at s1 is not '\0':
if character at s1 is not the same as character at s2:
exit while loop
increment s1 and s2
return difference between *s1 and *s2
当你到达第一个字符串的末尾或发现差异时,这将停止(如果你在第一个字符串之前到达第二个字符串的末尾,则包括)。