0

嗨,我在课堂上了解了 string.h 库,特别是关于与 strings 进行比较的 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;
}

我的问题是,当我输入下面的代码时,即“abc”它会打印到应该打印Not Palindrom的屏幕Palindrom,它从不打印Not Palindrom

4

3 回答 3

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。

于 2017-01-14T09:19:59.000 回答
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");
    }
}
于 2017-01-14T09:20:09.117 回答
-1

我已经添加

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

fgets(strArr , MAX_LENGTH , stdin);

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

完成代码:

#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;
}
于 2017-01-14T09:59:57.987 回答