字符串输出显示为null但为什么?

时间:2015-03-27 05:13:57

标签: c string

我的程序是检查String是否是回文。 但它显示的同时打印字符串。我找不到错误..

我正在使用Dev-Cpp

#include<stdio.h>
#include<string.h>

main()
{
 char string[25], rev_string[25]={'\0'};
 int i, length, flag=0;

 printf("Enter a string : ");
 gets(string);

 length=strlen(string);

 for(i=length; i>=0;i--)
  {
    rev_string[length-i-1]=string[i];
    flag=0;
    printf("%s",rev_string[length-i]);
  }

 for(flag=1,i=0; i<length;i++)
  {
    if(rev_string[i]!=string[i])    
    {
        flag=0;
    }   
  }
 if (flag == 1)
   printf ("%s is a palindrome \n", string);
 else
   printf("%s is not a palindrome \n", string);

 printf("%d",length);

}

4 个答案:

答案 0 :(得分:1)

替换

for(i=length; i>=0;i--)
  {
    rev_string[length-i-1]=string[i]; //For first iteration string[i] is '\0' here,also here you are accessing rev_string[-1]
    flag=0;
    printf("%s",rev_string[length-i]);  //here undefined behavior expected as format specifier in printf does not match with argument. 
  }

使用

 for(i=length-1; i>0;i--)
  {
    rev_string[length-i-1]=string[i];
    flag=0;

  }
  rev_string[length] = '\0';
  printf("%s",rev_string);

答案 1 :(得分:1)

程序中的逻辑没有任何特别的错误。但是我注意到有一些事情可以改进。

首先:定义main而不说它的返回类型会自动使其默认为整数。您的计划中没有return 0;

int main() {
    return 0;
}

另一个很大的细节是这一行,特别是printf("%s",rev_string[length-i]);。你用%s说“打印这个字符串”然后你说rev_string[length-i],这只是一个字符!因此,如果要打印每个字符,则需要将%s更改为%c。如果将其保留为%s,则最好在循环外打印它,并且仅在没有索引的情况下使用rev_string。我选择在我的例子中做后者。

另一个小细节,虽然不重要,但在你的第一个for循环中,你很多次都在说flag=0!如果你设置一次,我确信计算机会很好地记住第一次你告诉它。此外,flag还有一个值并不重要。在你的第二个while循环中,它获得值100%的时间。这也是最重要的地方。所以我们可以从for循环中删除它。这是不必要的:

for(i=length; i>=0;i--) {
    flag=0;
}

我更改了反转字符串的for循环。它与您指定的相同,但相反。如果你愿意,请保留你的,但我总是喜欢从0开始计算。

以下是重新格式化版本的建议:

#include<stdio.h>
#include<string.h>

int main()
{
    char string[25];
    char rev_string[25];

    // we don't need flag to have a value until the second for loop
    int i, length, flag;

    printf("Enter a string : ");
    // scanf is nice for user input
    scanf("%s", string);

    length=strlen(string);

    for(i = 0; i < length; i++)
    {   
        rev_string[i] = string[length-i-1];
    }
    // This tells where the string ends
    rev_string[length] = '\0';

    printf("Reversed string: %s\n", rev_string);

    // flag is 1 here, until rev_string[i]!=string[i]
    for(flag=1,i=0; i<length;i++)
    {
        if(rev_string[i]!=string[i])    
        {
            flag=0;
        }   
    }
    if (flag == 1)
        printf ("%s is a palindrome \n", string);
    else
        printf("%s is not a palindrome \n", string);

    printf("Length: %d\n",length);
    return 0;
}

答案 2 :(得分:0)

在第一个for循环中,您已放置此行,

printf("%s",rev_string[length-i]); 

%s用于打印字符串而不是单个字符。你可以删除这一行或这样的地方,

printf("%s\n",rev_string);

或使用%c,

printf("%c",rev_string[length-i]);

并使用fgets代替gets

char *fgets(char *s, int size, FILE *stream);

答案 3 :(得分:0)

你甚至不需要反转字符串,你只需要一个从字符串开头开始的索引i,以及从字符串末尾开始的另一个j。在递增string[i] == string[j]并递减i时检查j,直到ij在中间相遇。

int isPalindrome( char *string )
{
    int length = strlen( string );

    for ( int i = 0, j = length-1; i < j; i++, j-- )
        if ( string[i] != string[j] )
            return 0;

    return 1;
}

int main( void )
{
    if ( isPalindrome( "hello" ) )
        printf( "what the ???\n" );
    else
        printf( "nope\n" );

    if ( isPalindrome( "racecar" ) )
        printf( "yup\n" );
    else
        printf( "hey ?!?!\n" );
}