为什么strcmp失败了?

时间:2013-11-24 15:27:49

标签: c string codeblocks

我很遗憾在这个门户网站上提出这个问题。因为这可能是一个愚蠢的问题。但是,我正在努力找出strcmp无效的原因? 我也写了自己的strcmp,我发现s1revrev不同,正在拿着一些垃圾。请帮帮我哪里出错了?

void main()
{
int i,j;
 char rev[5];
 char s1[5]= "madam";
 for(i=strlen(s1)-1, j = 0; i>=0; j++, i--)
 {
  rev[j]=s1[i];
 }
 puts(rev);
 printf("\n");
 puts(s1);
if(strcmp(rev,s1) == 0)
{
printf("Palindrome!!! \n");

}
}

我代替strcmp(rev, s1)我自己i_strcmp(rev, s1)

int i_strcmp(char *s1, char *s2)
{
    int i;
    for (i = 0; s1[i] && s2[i]; ++i)
    {
        /* If characters are same or inverting the 6th bit makes them same */
        if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i])
           continue;
        else
           break;
    }

    /* Compare the last (or first mismatching in case of not same) characters */
    if (s1[i] == s2[i])
        return 0;
    if ((s1[i]|32) < (s2[i]|32)) //Set the 6th bit in both, then compare
        return -1;
    return 1;
}

但它仍然没有用,我试图调试它,并在rev中发现了一些垃圾值。但是当我将字符串打印到控制台时,它会向控制台提供正确的输出。

2 个答案:

答案 0 :(得分:7)

strlenstrcmp等所有功能都需要在结尾处使用\ x00的字符串。您的阵列没有空间(5个字符)。使用您自己的strcmp版本,您过于依赖\ x00限制器,这很可能不存在。

您可以使用strncmp代替。或者有更大的阵列。

答案 1 :(得分:3)

问题在于strlen然后是strcmp。

所有基于字符串的函数都基于C.So中的空终止字符,您的s1没有(空字符),因此strlen无法正常工作。

例如,检查此程序:

#include <stdio.h>

#include<string.h>

int main()

{  char a[7]="wwwwwww"; /* --------->No space reserved for NUL. */

    printf("%d",strlen(a));

}

输出为10. Strlen给出的结果不正确,因为你没有给它'\ 0'。