嗨,我在课堂上学到了string.h库,特别是strcmp函数,它比较了字符串.如果第一个字符串首先出现在字典中,它将返回一个大于0的数字,如果第二个字符串大于第一个字符串将返回小于0的数字,如果它们是等于它应该返回0. ive像这样使用它:
strcmp(strArr , strrev(strArr));
Run Code Online (Sandbox Code Playgroud)
随意教育我.
代码 :
#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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我进入即下面的代码"ABC"它输出到屏幕上回文它应该打印不回文,它永远不会打印不回文
原因是你调用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");
}
...
Run Code Online (Sandbox Code Playgroud)
请注意,由于您采用特定的输入方法,您可能还必须检查strArr的结尾是否有任何尾随空白字符.任何这样的尾随空白字符都可能通过影响比较结果而使您的逆转和比较策略无效.
如果没有那么多空间,或者如果MAX_SPACE值太大,另一种方法是使用自定义比较函数来检查字符串是否是回文而不必使用strcmp或strrev.