不使用库函数的c中字符串的回文

时间:2016-07-25 15:16:42

标签: c string palindrome

我实际上是使用反向和没有库函数的字符串副本创建字符串回文的代码。但它仍然显示它是回文。我做了什么错误。并且无论我是否给出它总是打印它总是回文是不是回文。我检查了互联网代码,但想知道我在代码中犯了什么错误,所以请帮忙。

#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;
}

3 个答案:

答案 0 :(得分:1)

无论代码的其余部分如何,我无法理解的是:

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

答案 1 :(得分:1)

不阻止使用库函数,代码中的错误是:

    使用
  • gets(),它具有不可避免的缓冲区溢出风险,在C99中弃用并从C11中删除。
  • printf("%s",t);调用
  • 未定义的行为,其中传递的指针不是以空字符结尾的字符串,以便与%s一起使用。
  • 条件t[j]==t[i]是错误的,因为总是会比较相同的事情。
  • 您使用flag检查&#34; 至少任何一个字符是否相同&#34;。您应该检查&#34; 所有字符是否相同&#34;。

试试这个:

#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;
}

此代码中不支持库函数。您可以通过自己实现(稍微)等同于它们的内容并将库函数的使用替换为您的实现来避免使用它们。

答案 2 :(得分: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 )