我有一个关于这个代码的问题,我正在写一个练习。我要检查字符串是否是回文。我无法更改函数的声明。当所有字母都相同时(如“aaaa”),函数只返回1,但如果我用其他回文(如“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;
}
答案 0 :(得分:7)
您确定字符串是否为回文的功能尚未经过深思熟虑。
我们假设您有一个长度为s
的字符串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;
}
答案 1 :(得分:0)
MARCO试试这个。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
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<len;i++)
{
if(a[i]==a[len-i-1])
flag=flag+1;
}
return flag;
}
答案 2 :(得分:0)
如果字符串的第一个字符等于最后一个字符,则pali
函数测试,然后调用自身以获取字符串第二个字符的位置。但请注意,它不会修改字符串的结尾,因此递归调用会将第二个字符再次与最后一个字符进行比较。然后你将第三个字符与最后一个字符进行比较...如果所有字符等于最后一个字符,则最后pali
返回1
,即如果所有字符都相等。 / p>
试试这个:
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;
}