检查阵列是否为回文的程序

时间:2016-01-22 12:23:22

标签: c string palindrome

我正在尝试创建一个程序来检查给定的数组/字符串是否是回文并且它不起作用。程序只在每个给定的数组上打印“0”,即使是在回文中。

int main()
{

    char string[100]= {0};
    char stringReverse[100]= {0};

    int temp = 0;
    int firstLetter = 0;
    int lastLetter = 0;

    printf("Please enter a word or a sentence: ");
    fgets(string, 100, stdin);

    strcpy(stringReverse , string); // This function copies the scanned array to a new array called "stringReverse"

    firstLetter = 0;
    lastLetter = strlen(string) - 1;    //because in array, the last cell is NULL

    // This while reverses the array and insert it to a new array called "stringReverse"
    while(firstLetter < lastLetter)
    {
        temp = stringReverse[firstLetter];
        stringReverse[firstLetter] = stringReverse[lastLetter];

        stringReverse[lastLetter] = temp;

        firstLetter++;
        lastLetter--;
    }

    printf("%s    %s", stringReverse, string);

    if ( strcmp(stringReverse , string) == 0)
    {
        printf("1");
    }
    else
    {
        printf("0");
    }
} 

6 个答案:

答案 0 :(得分:5)

让我们说我们实现了一个简单的乐趣

int check_palindrome (const char *s) {
   int i,j;
   for (i=0,j=strlen(s)-1 ; i<j ; ++i, --j) {
      if (s[i] != s[j]) return 0; // Not palindrome
   }
   return 1; //Palindrome
}

我认为这要简单得多;)

对于发布的代码: 注意fgets()。它在第一个'\ n'或EOF中停止,并保留'\ n'字符。

因此,如果您为ex提供雷达,则结果字符串将为“radar \ n”,这与“\ nradar”不匹配< /强>

答案 1 :(得分:2)

问题:

我们假设您输入字符串RACECAR作为程序的输入并按Enter键,这会在缓冲区流中添加换行符或'\n',这也将作为一部分读取fgets的字符串,因此您的程序最终会检查RACECAR\n是否为回文,不是

解决方案:

lastLetter初始化为strlen(string) - 1后,检查字符串中的最后一个字符(或lastLetter索引处的字符是否为换行符(\n),如果所以,将lastLetter减一,以便您的程序检查字符串的其余部分(RACECAR)是否为回文。

lastLetter = strlen(string) - 1;    //because in array, the last cell is NULL

// Add these 2 lines to your code
// Checks if the last character of the string read by fgets is newline
if (string[lastLetter] == '\n')
    lastLetter--;

答案 2 :(得分:1)

fgets在最后添加'\ n'。 因此,如果用户输入“aba”,string包含“aba \ n”。 reverseString包含“\ naba”。

所以它不匹配。

在fgets之后,添加此代码

int l = strlen(string) - 1;
string[l] = 0;

这将在结束前删除'\ n',然后再将其复制到reverseString

除此之外,您可以在不需要第二个缓冲区或strcpystrlen来电的情况下完成整个程序。

答案 3 :(得分:1)

您的代码中有几个问题:

  • 首先你忘记了最后一个大括号};
  • 然后您忘记删除\n中的尾随\r(或者也可能是string);
  • 您不需要将字符串恢复为新字符串;一次检查就足够了:

这是一个有效的代码:

#include <stdio.h>
#include <string.h>
int main()
{

    char string[100]= {0};

    int temp = 0;
    int firstLetter = 0;
    int lastLetter = 0;

    printf("Please enter a word or a sentence: ");
    fgets(string, 100, stdin);

    firstLetter = 0;
    lastLetter = strlen(string) - 1;    //because in array, the last cell is NULL
    while ((string[lastLetter]=='\n')||(string[lastLetter]=='\r')) {
        lastLetter--;
    }

    // This while reverses the array and insert it to a new array called "stringReverse"
    temp = 1;
    while(firstLetter < lastLetter)
    {
        if (string[firstLetter] != string[lastLetter]) {
            temp = 0;
            break;
        }

        firstLetter++;
        lastLetter--;
    }

    if ( temp )
    {
        printf("1");
    }
    else
    {
        printf("0");
    }
}

答案 4 :(得分:0)

你也可以通过这种简单的方式来做到这一点。

#include <stdio.h>
#include <string.h>

int main()
{
    char string[10], revString[10];
    printf("Enter string for reversing it...\n");
    scanf("%s", string);

    int stringLength = strlen(string);

    for(int i = 0; string[i] != '\0'; i++, stringLength--)
    {
    revString[i] = string[stringLength - 1];
    }

    if(strcmp(string,  revString) == 0)
         printf("Given string is pelindrom\n");
    else
         printf("Given string is not pelindrom\n");
}

答案 5 :(得分:0)

#include<stdio.h>
#include<string.h>`enter code here`
void fun(char *a);
 int main () 
 {    
     
      char p[100];
      char *s=p;
      
     printf("enter the string");
     scanf("%[^\n]",s);
     fun(s);
   
     
 }

void fun(char *a)
 { 
 
        
      if(*a && *a!='\n')
     {
      fun(a+1);
       
          putchar(*a);
       
      }
}

// 使用这种方法更好的时间复杂度和更容易的工作希望这会有所帮助