我正在编写一些代码来检查字符串是否是回文,但它给了我一个运行时错误。我无法找出错误的位置。请帮忙。
#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;
}
答案 0 :(得分:1)
嗯,在编译和执行它时,我注意到的第一件事是 它不会让你输入字符串。这是由于你的方式 接受输入:
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
个字符。但它
如果你计算长度,那将是必要的。
答案 1 :(得分:0)
看看这段代码,我是如何实现它的(请记住#include <stdbool.h>
或者它不起作用):
for(i = 0; i < string_length; i++)
{
if(sentence[i] == sentence[string_lenght-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
这样做会检查你的句子是否是回文,并且在第一次出现时这不是真的,它将打破for循环。你可以使用像
这样的东西if(palindrome)
printf(..);
else
printf(..);
为用户提供简单的提示。
示例:
雷达是回文abba是回文
abcabc不是回文
请注意
这一事实阿巴
由于&#39;不被认为是回文。 A&#39;和&#39; a&#39;有不同的ASCII码:
&#39; A&#39;值为65
&#39;一个&#39;的值为97 根据{{3}}。您可以找到更多ASCII table。
您可以避免此问题将字符串的所有字符转换为小写字符。
您可以执行此操作,包括<ctype.h>
库并调用函数int tolower(int c);
,如下所示:
编辑:我做了一个简单的程序(不过它是一个样本,它可以进一步优化等等,它只是为了给你这个想法),看看它是否可以帮到你for ( ; *p; ++p) *p = tolower(*p);
或
for(int i = 0; str[i]; i++){ str[i] = tolower(str[i]); }
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>
void LowerCharacters(char *word, int word_lenth);
int main(void){
char *word = (char *) malloc(10);
bool palindrome = false;
if(word == 0)
{
printf("\nERROR : Out of memory.\n\n");
return 1;
}
printf("\nEnter a word to check if it is palindrome or not : ");
scanf("%s", word);
int word_length = strlen(word);
LowerCharacters(word,word_length);
for(int i = 0; i < word_length; i++)
{
if(word[i] == word[word_length-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word);
free(word);
return 0;
}
void LowerCharacters(char *word, int word_length){
for(int i = 0; i < word_length; i++)
word[i] = tolower(word[i]);
}
输入:
输入一个单词以检查它是否是回文:RadaR
输出:
雷达这个词是回文。