gpt4 book ai didi

检查字符串是否是回文

转载 作者:行者123 更新时间:2023-11-30 20:24:24 25 4
gpt4 key购买 nike

我正在编写一些代码来检查字符串是否是回文,但它给了我一个运行时错误。我无法找出错误在哪里。请帮忙。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[20];
int n,c;
c=0;
printf("enter the size of the string ");
scanf("%d",&n);
printf("enter the string ");
fgets(a,n,stdin);

for(int i=0;i<(n-1)/2;i++)
{
if(a[i]==a[n-1-i])
{
c=0;
}
else
{
c=1;
break;
}
}

if(c==0)
printf("string is palindrome");
else
printf("string is not palindrome");

return 0;
}

最佳答案

嗯,在编译和执行这个之后,我注意到的第一件事是它不允许您输入字符串。这是由于你的方式接受输入:

printf("enter the size of the string  ");
scanf("%d",&n);
printf("enter the string ");
fgets(a,n,stdin);

它运行scanf("%d",&n);。因此,用户输入 6,然后输入回车键。 Hokay,所以 scanf 查看这些字符 6\n,获取6,转换为数字,n 最终值为 6。

但是换行符仍然存在。 scanf 没有对它做任何事情因为它不是数字。所以,当代码到达这里时:

fgets(a,n,stdin);

然后它会读取该换行符并思考“好吧!用户输入了一个空的字符串。” (是的,我知道我正在拟人化,起诉我。)

这种行为就是我避免使用 scanf 的原因。我会这样编码方式:

fgets(a, sizeof(a), stdin);
n = atoi(a);
printf("enter the string ");
fgets(a, sizeof(a), stdin);

请注意,这也将每个 fgets 限制为缓冲区的大小,避免潜在的缓冲区溢出。这是一个重要的考虑因素使用工作代码,因为缓冲区溢出很容易导致可被利用来破坏安全的漏洞。最好发展即使是像这样简单的学习计划,也要养成良好的习惯。

另请注意,更好的方法是简单地阅读字符串本身,然后使用 strlen 计算其长度。

目前看来,它工作正常,所以我不会深究其余的。但是,如果您接受我关于计算的建议长度,还有一件事需要注意。如果添加这一行(暂时,仅用于调试目的):

printf("%d\n", strlen(a));

你会发现你比你想象的多了一个角色。那是因为 fgets 保留了换行符。所以,我们想摆脱它:

a[strlen(a) - 1] = '\0';

如果您使用n的值,则没有必要,因为这样它就会只需忽略换行符并使用其前面的 n 字符即可。但它如果您要计算长度,则这是必要的。

关于检查字符串是否是回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com