嗨,我在课堂上学习了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;
}

我的问题是,当我输入下面的代码,即“abc”时,它会打印到屏幕上的回文,而屏幕上的回文应该不会打印,也不会打印回文

最佳答案

原因是您调用了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。

关于c - strcmp仅返回0(palindrom算法错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41648403/

10-13 08:19