2010-09-24 21 views
0

我试图比较2个字符*相同的字符串,但其中一个包含一个空终止符在最后。 我一直在寻找通过互联网,并理解,不建议删除空终止符字符因为它会使字符串不稳定。 我可以使用其他什么方法?null终止符问题,而比较相同的字符*

比较功能:

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; 
}  

的感谢!

+4

你为什么要滚动你自己的StringCompare,在strings.h中找到strcmp? – t0mm13b 2010-09-24 16:41:17

+1

您遇到的问题到底是什么? – sth 2010-09-24 16:43:23

+0

strcmp首先检查长度,如果它们不同则返回它们不相同。 – 2010-09-24 16:48:17

回答

4

您正在使用strlen,其中要求在字符串末尾有一个空终止符。如果您通过的其中一个字符串没有终止符,则保证失败。

+0

什么其他函数可以告诉我char *的大小? – 2010-09-24 16:45:19

+0

@shiran吧,有'sizeof'运算符,但这可能不是你想要的。你想达到什么目的?如果你能澄清你的目标,我们可以更好地帮助你理解你需要做什么。 – strager 2010-09-24 16:48:52

+1

@shiran吧,从C继承的经典'char *'字符串按照定义结束为null。你可以使用'std :: string'来代替长度作为单独的属性,或者你可以将长度和字符串一起传递给函数。 – 2010-09-24 16:53:09

3

我希望你的char*字符串在末尾有空终止符!空终止符使得像strlen这样的函数能够确定长度,并知道字符串何时结束。

4

你对两者都调用strlen,所以它们最好都在最后都有NUL(不是NULL)。一旦你到达NUL之一,你需要停止比较,因为字符串已经完成了!而已!任何后续数据都不属于该字符串。

2

您的代码不可能工作,除非str1str2具有空终止符。否则,你(或strlen)怎么知道他们是多久?

如果真正的问题是“我如何使用包含嵌入的NUL字符的字符串?”,你应该使用vector<char>或类似的。你不再谈论字符串,因为根据定义,字符串是NUL终止的。

4

请阅读关于C字符串的此posting并理解它。所有c字符串都需要一个nul终止符来表示C运行时,字符串的末尾已经到达。 nul结束符是\0。注意nul和null之间的区别,以便清除任何潜在的混淆 - 在处理字符串时,它的nul,指针为NULL!

+0

因为你只是指另一篇文章(即使它是你自己的文章),我会建议你做出这个CW答案。 – strager 2010-09-24 16:45:34

5

使用std :: string,就是这样。没有常识,请使用strcmp()。

+0

+1好唔... – pm100 2010-09-24 17:40:56

2

如果你想比较2个字符串,但你不能确定它们都是空终止的,你的方法签名需要将传递字符串的大小作为参数,否则strlen会告诉你有多少字节从char *指针指向第一个存储单元0.

3

如果您知道两个字符串中的哪一个具有空终止符,则可以对其调用strlen()并将其用作这两个字符串的长度。但这是一个可怕的黑客 - 你没有真正比较任何东西。

假设你有两个字符串:

"abc\0" 
"abcdef\0" 

是字符串2空值终止?或者是“def \ 0”部分只是随机垃圾?

要确定的唯一方法是空终止所有字符串。

3

如果只有一个字符串是空终止的,则应该修改循环,以便在任何字符串都达到空值时结束并省略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的答案具有相同的效果。