我的程序是检查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);
}
答案 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
,直到i
和j
在中间相遇。
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" );
}