[英]Palindrome of string in c without using library functions
我實際上使用反向和字符串復制創建了字符串回文的代碼,但沒有使用庫函數。但是仍然顯示總是回文,我犯了什么錯誤,並且無論我是否給出回文,它總是打印它總是一個回文。我檢查了互聯網上的代碼,但想知道我在代碼中犯了什么錯誤,請提供幫助。
#include <stdio.h>
#include <string.h>
int main()
{
char s[1000];
char t[1000],temp;
int i,j,flag=0;
gets(s);
for(i=0;i<strlen(s);i++)
{
t[i]=s[i];
}
printf("%s",t);
int n=strlen(s)-1;
for(j=0,i=n;i>=0;j++,i--)
{
t[j]=s[i];
}
printf("%s",t);
for(i=0,j=0;i<=n,j<=n;i++,j++)
{
//for(j=0;j<n;j++){
if(t[j]==t[i])
{
flag=1;
break;
}
}
if(flag==1)
{
printf(" palindrome");
}
else
{
printf("else Palindrome");
}
return 0;
}
無論其余代碼如何,我都無法理解:
for(i=0,j=0;i<=n,j<=n;i++,j++)
{
if(t[j]==t[i])//here you are comparing same indices of the same array,always true
{
flag=1; //executed when i=0,j=0
break;
}
}
if(flag==1)
{
printf(" palindrome");
}
else
{
printf("else Palindrome");
}
因此,您一定會一直患有回文症。 您可以嘗試以下方法:
int m=n/2,flag=0;
for(int i=0;i<m;i++)
if(s[i]==s[n-i-1])
flag++;
if(flag==m)
//palindrome;
else
//not
在不阻止使用庫函數的情況下,代碼中的錯誤是:
gets()
,它具有不可避免的緩沖區溢出風險,在C99中已棄用並從C11中刪除。 printf("%s",t);
處調用printf("%s",t);
,其中將指向非空終止字符串的指針傳遞給%s
。 t[j]==t[i]
是錯誤的,因為總是比較相同的事物。 flag
來檢查“ 至少一個字符是否相同”。 您應該選中“ 所有字符都相同”。 嘗試這個:
#include<stdio.h>
#include<string.h>
int main(void)
{
char s[1000],*lf;
char t[1000],temp;
int i,j,n,flag=1;
/* use fgets() instead of gets() */
fgets(s, sizeof(s), stdin);
if((lf=strchr(s, '\n'))!=NULL)
{
*lf = '\0';
}
n=strlen(s);
for(i=0;i<n;i++)
{
t[i]=s[i];
}
/* terminate the string */
t[n]='\0';
printf("%s",t);
n=strlen(s)-1;
for(j=0,i=n;i>=0;j++,i--)
{
t[j]=s[i];
}
printf("%s",t);
for(i=0;i<=n;i++)
{
/* check if all characters are same */
if(s[i]!=t[i])
{
flag=0;
break;
}
}
if(flag==1)
{
printf(" palindrome");
}
else
{
printf("else Palindrome");
}
return 0;
}
此代碼中未避免使用庫函數。 您可以通過自己實現(某種程度上)等同於它們(並在某種程度上代替庫函數的用法)來避免使用它們。
我認為分配的要求意味着您不能使用標准的字符串函數。
要確定一個字符串是否是回文,就無需創建該字符串的副本並反轉該副本。 您可以選中此“到位”。
這是一個示范節目
#include <stdio.h>
int is_palindrome( const char *s )
{
size_t n = 0;
while ( s[n] != '\0' ) n++;
size_t i = 0;
while ( i < n / 2 && s[i] == s[n-i-1] ) i++;
return i == n / 2;
}
#define N 100
int main( void )
{
char s[N];
fgets( s, sizeof( s ), stdin );
size_t n = 0;
while ( s[n] != '\0' && s[n] != '\n' ) n++;
if ( s[n] ) s[n] = '\0';
if ( is_palindrome( s ) ) printf( "%s is a palindrome\n", s );
return 0;
}
例如,如果輸入字符串ABCDEDCBA
則程序輸出為
ABCDEDCBA is a palindrome
對於您的程序,它使用標准字符串函數strlen
。 原始字符串的副本不是零終止的。 而這個循環
for(i=0,j=0;i<=n,j<=n;i++,j++)
{
//for(j=0;j<n;j++){
if(t[j]==t[i])
{
flag=1;
break;
}
即使您使用正確的索引也沒有意義。
考慮到功能gets
是不安全的,並且C標准不再支持該功能。 而是使用標准函數fgets
,該函數將輸入的字符串附加換行符(如果字符串中有足夠的空格),應將其刪除。
同樣在C中不帶參數的main函數應聲明為
int main( void )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.