簡體   English   中英

不使用庫函數的c中的字符串回文

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM