检查C中的字符串是否是回文结构

我有一个关于这个代码的问题,我正在写一个练习。 我要检查字符串是否是回文。 我无法更改函数的声明。函数只返回1,当所有字母都相同(如“aaaa”)但如果我用其他回文(如“anna”)收取句子,函数返回0,我无法弄清楚为什么会出现这种情况。谢谢!

char* cargar (char*); int pali (char*); int main() { char*texto=NULL; texto=cargar(texto); int res=pali(texto); if(res==1){printf("\nPalindrome");} else printf("\nNot palindrome"); return 0; } char* cargar (char*texto) { char letra; int i=0; texto=malloc(sizeof(char)); letra=getche(); *(texto+i)=letra; while(letra!='\r'){ i++; texto=realloc(texto,(i+1)*sizeof(char)); letra=getche(); *(texto+i)=letra;} *(texto+i)='\0'; return texto; } int pali (char* texto) { int i; for(i=0;*(texto+i)!='\0';i++){ }i--; if(i==0||i==1){return 1;} if(*texto==*(texto+i)){ return pali(++texto); } else return 0; } 

您确定字符串是否为回文结构的function还没有深思熟虑。

假设你有一个长度为l的字符串。 字符串中的字符布局如下:

 Indices: 0 1 2 3 l-4 l-3 l-2 l-1 +----+----+----+----+- ... -+----+----+----+----+ | | | | | ... | | | | | +----+----+----+----+- ... -+----+----+----+----+ 

如果字符串是回文,

 s[0] = s[l-1] s[1] = s[l-2] ... 

您可以停止检查LHS的索引何时大于或等于RHS的索引。

要将其转换为代码,

 int is_palindrome(char const* s) { size_t len = strlen(s); if ( len == 0 ) // An empty string a palindrome { return 1; } size_t i = 0; size_t j = len-1; for ( ; i < j; ++i, --j ) { if ( s[i] != s[j] ) { // the string is not a palindrome. return 0; } } // If we don't return from inside the for loop, // the string is a palindrome. return 1; } 

MARCO试试这个。

 #include  #include  #include char* cargar (char*); int pali (char*); int main() { char*texto=NULL; texto=cargar(texto); int res=pali(texto); if(res==strlen(texto)){printf("\nPalindrome");} else printf("\nNot palindrome"); return 0; } char* cargar (char*texto) { char letra; int i=0; texto=malloc(sizeof(char)); letra=getche(); *(texto+i)=letra; while(letra!='\r') { i++; texto=realloc(texto,(i+1)*sizeof(char)); letra=getche(); *(texto+i)=letra; } *(texto+i)='\0'; return texto; } int pali (char* a) { int flag=0,i; int len=strlen(a); for (i=0;i 

如果字符串的第一个字符等于最后一个字符,则调用函数测试,然后调用自身以获取字符串第二个字符的位置。 但请注意,它不会修改字符串的结尾 ,因此递归调用会将第二个字符再次与最后一个字符进行比较。 然后你将第三个字符与最后一个字符进行比较…如果所有字符都等于最后一个字符 ,则最终pali返回1如果所有字符都相等。

试试这个:

 int pali (char* texto) { char* end; for(end = texto; *end != '\0'; end ++) ; for(--end; texto < end; ++texto, --end) { if(* texto != * end) return 0; } return 1; }