检查字符串是否是回文

时间:2015-11-12 15:09:58

标签: c string

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

#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;
}

2 个答案:

答案 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]);
}
     

here代码,请查看Earlz以深入了解该内容。

编辑:我做了一个简单的程序(不过它是一个样本,它可以进一步优化等等,它只是为了给你这个想法),看看它是否可以帮到你

#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

输出:

  

雷达这个词是回文。