strcmp仅返回0(palindrom algo bug)

时间:2017-01-14 09:15:05

标签: c strcmp string.h

您好我在课堂上学习了string.h库,特别是关于strcmp函数的比较。 如果第一个字符串首先出现在字典中,它将返回一个大于0的数字,如果第二个字符串大于第一个字符串将返回小于0的数字,如果它们是等于它应该返回0。 香港专业教育学院使用它:

strcmp(strArr , strrev(strArr));

随时教育我。

代码:

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

#define MAX_LENGTH 100
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0.
int main(void)
{
    char strArr[MAX_LENGTH];
    printf("Enter string (max length 100 chars): ");
    fgets(strArr , MAX_LENGTH , stdin);
    int pali = strcmp(strArr , strrev(strArr));
    if(pali == PALINDROM_TRUE)
    {
        printf("Palindrom\n");
    }
    else
    {
        printf("Not Palindrom\n");
    }
    system("PAUSE");
    return 0;
}

我输入的问题是下面的代码,即&#34; abc&#34;它打印到 Palindrom 的屏幕上,它应该打印 Not Palindrom ,它从不打印 Not Palindrom

3 个答案:

答案 0 :(得分:6)

原因是你调用strrev()。 strrev()函数就地工作。换句话说,strrev在与原始数组相同的缓冲区(即strArr数组)上工作,并且不为反转字符串分配新空间。因此,一旦用strArr调用strrev(),strArr中的字符串就会反转,而你所做的只是比较两个相同的字符串:strArr中的字符串,strArr中的字符串,现在都是逆转。 (请注意,这两个术语可能都是错误的。实际上,只有一个缓冲区,strcmp的两个参数都指向那个。)

解决此问题的一种方法是分配第二个数组strArr2并将字符串复制到其中。然后,反转strArr2中的字符串,并使用strArr和strArr2调用strcmp。以下是此解决方案在代码中的外观。

    ...
    char strArr2[MAX_LENGTH];
    ...
    strcpy(strArr2, strArr);
    strrev(strArr2);
    int pali = strcmp(strArr , strArr2);
    if(pali == PALINDROM_TRUE)
    {
        printf("Palindrom\n");
    }
    else
    {
        printf("Not Palindrom\n");
    }
    ...

请注意,由于您采用特定的输入方法,您可能还必须检查strArr的结尾是否有任何尾随空白字符。任何此类尾随空格字符都可能会影响比较结果,从而使反转和比较策略无效。

如果没有那么多空间,或者MAX_SPACE值太大,另一种方法是使用自定义比较函数来检查字符串是否为回文结构,而不必使用strcmp或strrev。

答案 1 :(得分:2)

int pali = strcmp(strArr , strrev(strArr));

这条线显然是个问题。

strrev(strArr)的调用会反转strArr,因此在调用strcmp后,您是否期望strArr有所不同?但它是同一个变量......

您必须创建另一个char数组来存储反向字符串。

修改

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

#define MAX_LENGTH 100

int main(void)
{
    char str[MAX_LENGTH];
    char rev[MAX_LENGTH];

    puts("Enter string (max length 100 chars): ");
    scanf("%s", str); 

    strcpy(rev, str);
    strrev(rev);

    if(strcmp(str, rev) == 0) {
        puts("Palindrom"); 
    } else {
        puts("Not Palindrom");
    }
}

答案 2 :(得分:-1)

我添加了

strArr[strcspn(strArr, "\n")] = 0;

之后

fgets(strArr , MAX_LENGTH , stdin);

它起作用了,它最后基本上重写了(null)。这反过来搞乱反向,在字符串的开头包含null(0)。 谢谢大家。

Finsihed代码:

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

#define MAX_LENGTH 100
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0.
int main(void)
{
    char strArr[MAX_LENGTH], strArrRev[MAX_LENGTH];
    printf("Enter string (max length 100 chars): ");
    fgets(strArr , MAX_LENGTH , stdin);
    strArr[strcspn(strArr, "\n")] = 0;
    strcpy(strArrRev, strArr);
    int pali = strcmp(strArr , strrev(strArrRev));
    if(pali == PALINDROM_TRUE)
    {
        printf("Palindrom\n");
    }
    else
    {
        printf("Not Palindrom\n");
    }
    system("PAUSE");
    return 0;
}