如何解决c - 反向字符串比较回文
我想检查输入的文本是否有回文。
但是,当我输入回文时,我总是知道它不是回文。我是否对存储的换行符做错了什么?
#include<stdio.h>
#include<string.h>
int main()
{
char text[256],reverse[256];
int i,j;
printf("Type a text: ");
fgets(text,255,stdin);
j = strlen(text)-1;
for (i=0; i<=j; ++i)
{
if(text[i] >= 'A' && text[i] <= 'Z')
{
text[i] += 32;
}
if(text[i] == '\n')
{
text[i] = i - 1;
}
}
i = strlen(text)-1;
for (i = i,j = 0 ;i >= 0 ; --i,++j)
{
reverse[j] = text[i];
}
printf("Text: %s\n",text);
printf("Reverse: %s\n",reverse);
if (strcmp(text,reverse) == 0)
{
printf("The entered text \"%s\" is a palindrome!\n",text);
}
else
{
printf("The entered text \"%s\" is NOT a palindrome!\n",text);
}
}
解决方法
是的,你对换行符的处理是错误的。
您用其他(或可能相同)字符替换了换行符,但这意味着字符串中会有一个额外的字符,而额外的字符会阻止字符串被判断为回文。
您应该将换行符替换为 '\0'
(NUL 字符),它在 C 中用作字符串终止标记。
这个if语句
if(text[i] == '\n')
{
text[i] = i - 1;
}
没有意义。此外,由于换行符 '\n'
是输入字符串中的单个字符,因此将其保留在字符串中将导致该字符串不是回文。
您需要将其替换为零字符 '\0'
。
并且数组 reverse
在此循环后不包含字符串
for (i = i,j = 0 ;i >= 0 ; --i,++j)
{
reverse[j] = text[i];
}
同样使用函数 strlen
是多余且低效的。
程序可以如下所示。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
char text[256],reverse[256];
printf( "Type a text: " );
fgets( text,sizeof( text ),stdin );
size_t n = 0;
while ( text[n] != '\0' )
{
if ( text[n] == '\n' )
{
text[n] = '\0';
}
else
{
text[n] = tolower( ( unsigned char )text[n] );
++n;
}
}
reverse[n] = '\0';
for ( size_t i = 0; n-- != 0; i++ )
{
reverse[n] = text[i];
}
printf( "Text: \"%s\"\n",text );
printf( "Reverse: \"%s\"\n",reverse);
if ( strcmp( text,reverse ) == 0 )
{
printf( "The entered text \"%s\" is a palindrome!\n",text );
}
else
{
printf( "The entered text \"%s\" is NOT a palindrome!\n",text );
}
return 0;
}
程序输出可能看起来像
Type a text: ABC cba
Text: "abc cba"
Reverse: "abc cba"
The entered text "abc cba" is a palindrome!
一般来说,当您需要一个辅助数组并且源字符串正在更改时,您所使用的方法并不好。
您可以编写一个简单的函数,如该演示程序所示。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int is_palindrome( const char *s )
{
size_t n = strlen( s );
size_t i = 0;
while ( i < n / 2 && tolower( ( unsigned char )s[i] ) ==
tolower( ( unsigned char )s[n -i -1] ) )
{
++i;
}
return i == n / 2;
}
int main(void)
{
char text[256];
printf( "Type a text: " );
fgets( text,stdin );
text[ strcspn( text,"\n" ) ] = '\0';
printf( "Text: \"%s\"\n",text );
if ( is_palindrome( text ) )
{
printf( "The entered text \"%s\" is a palindrome!\n",text );
}
return 0;
}
程序输出可能看起来像
Type a text: ABC cba
Text: "ABC cba"
The entered text "ABC cba" is a palindrome!
如您所见,除了换行符 '\n'
被零字符 '\0'
替换外,原始字符串没有改变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。