我尝试比较2个char *相同的字符串,但其中一个字符串末尾包含一个空终结符。 我一直在浏览互联网,并明白不推荐删除null终结符char,因为它会使字符串不稳定。 我可以使用其他什么方法?
比较功能:
int StringCompare(const char* str1, const char* str2)
{
int size1 = strlen(str1), size2 = strlen(str2), min = 0, index =0;
bool bigger1 = true;
if(size1>size2)
min=size2;
else
min=size1;
for(index=0;index<min;index++)
{
if(str1[index]>str2[index])
return 1;
if(str1[index]<str2[index])
return (-1);
}
if(size1==size2)
return 0;
if(min==size1)
return (-1);
else
return 1;
}
谢谢!
答案 0 :(得分:5)
使用std :: string,这就是它的用途。失败的常识,使用strcmp()。
答案 1 :(得分:4)
您正在使用strlen
要求字符串末尾的空终结符。如果您传递的其中一个字符串没有终止符,则可以保证失败。
答案 2 :(得分:4)
你们两个都在调用strlen,所以他们最好都有NUL(不是NULL)。一旦你到达其中一个NUL,你需要停止比较,因为字符串已经完成!而已!任何后续数据都不属于该字符串。
答案 3 :(得分:4)
请阅读posting关于C字符串并理解它。 ALL c字符串需要一个nul终结符来表示C运行时已到达字符串的结尾。 nul终结符是\0
。注意nul和null的使用之间的区别,以便清除任何潜在的混淆 - 当处理字符串时,它的nul,指针是NULL!
答案 4 :(得分:3)
我希望两者你的char*
字符串最后都有空终结符! null终止符使strlen
等函数能够确定长度,并知道字符串何时结束。
答案 5 :(得分:3)
如果您知道两个字符串中的哪一个具有空终止符,则可以在其上调用strlen()并将其用作两个字符串的长度。但这是一个可怕的黑客 - 你真的没有比较任何东西。
假设您有两个字符串:
"abc\0"
"abcdef\0"
字符串2是否以空值终止?或者“def \ 0”的一部分只是随机垃圾?
唯一可以确定的是终止所有字符串。
答案 6 :(得分:3)
如果只有一个字符串以空值终止,则应修改 for 循环,以便在达到任一字符串的null时结束,并省略strlen()调用。
for(index=0;;index++)
{
if(!str1[index]) {
if(!str2[index])
return 0; // strings are equal in length
return -1; // str1 < str2 since str2 is longer
}
if(!str2[index])
return 1; // str1 > str2 since str1 is longer
if(str1[index]>str2[index])
return 1;
if(str1[index]<str2[index])
return (-1);
}
请注意,这与Matteo Italia的答案具有相同的效果。
答案 7 :(得分:2)
除非 str1
和str2
都有空终止符,否则您的代码无法正常工作。否则,你(或strlen
)如何知道它们有多长?
如果真正的问题是“我如何处理包含嵌入式NUL字符的字符串?”,则应使用vector<char>
或类似字符。你不再谈论字符串,因为根据定义字符串是NUL终止的。
答案 8 :(得分:2)
如果你试图比较2个字符串并且你不能确定它们都将被终止,你的方法签名需要将传递的字符串的大小作为参数,否则strlen会告诉你那里有多少字节是从char *指针到第一个内存位置0。