在C中检查一个字符串是否为回文
Check if a string is palindrome in C
我对我为练习编写的这段代码有疑问。我必须检查一个字符串是否是回文。当所有字母都相同时(如 "aaaa"),我不能仅更改 function.The 函数的声明 return 1 但如果我用其他回文(如 "anna") 函数 return me 0 ,我不明白为什么这个 appening.Thank you!
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)='[=10=]';
return texto;
}
int pali (char* texto)
{
int i;
for(i=0;*(texto+i)!='[=10=]';i++){
}i--;
if(i==0||i==1){return 1;}
if(*texto==*(texto+i)){
return pali(++texto);
}
else return 0;
}
你判断字符串是否回文的函数没有考虑好。
假设您有一个长度为 l
的字符串 s
。字符串中的字符布局为:
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;
}
马可试试这个。
#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)='[=10=]';
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;
}
您 pali
函数测试字符串的第一个字符是否等于最后一个字符,然后调用自身来确定字符串第二个字符的位置。但是请注意,它不会修改 字符串的末尾 ,因此递归调用会再次将第二个字符与最后一个字符进行比较。然后将第三个字符与最后一个字符进行比较......最后 pali
returns 1
如果 所有字符 都等于最后一个字符,则如果所有人都平等。
试试这个:
int pali (char* texto)
{
char* end;
for(end = texto; *end != '[=10=]'; end ++)
;
for(--end; texto < end; ++texto, --end) {
if(* texto != * end)
return 0;
}
return 1;
}
我对我为练习编写的这段代码有疑问。我必须检查一个字符串是否是回文。当所有字母都相同时(如 "aaaa"),我不能仅更改 function.The 函数的声明 return 1 但如果我用其他回文(如 "anna") 函数 return me 0 ,我不明白为什么这个 appening.Thank you!
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)='[=10=]';
return texto;
}
int pali (char* texto)
{
int i;
for(i=0;*(texto+i)!='[=10=]';i++){
}i--;
if(i==0||i==1){return 1;}
if(*texto==*(texto+i)){
return pali(++texto);
}
else return 0;
}
你判断字符串是否回文的函数没有考虑好。
假设您有一个长度为 l
的字符串 s
。字符串中的字符布局为:
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;
}
马可试试这个。
#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)='[=10=]';
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;
}
您 pali
函数测试字符串的第一个字符是否等于最后一个字符,然后调用自身来确定字符串第二个字符的位置。但是请注意,它不会修改 字符串的末尾 ,因此递归调用会再次将第二个字符与最后一个字符进行比较。然后将第三个字符与最后一个字符进行比较......最后 pali
returns 1
如果 所有字符 都等于最后一个字符,则如果所有人都平等。
试试这个:
int pali (char* texto)
{
char* end;
for(end = texto; *end != '[=10=]'; end ++)
;
for(--end; texto < end; ++texto, --end) {
if(* texto != * end)
return 0;
}
return 1;
}