如何获得在一个句子中找到的回文词的总数

How to get the total count of palindrome words found in a sentence

我正在开发一个接受长字符串作为输入(一个句子)的程序。该程序将检查字符串并计算找到的回文词的数量,然后 return 计数。

示例:

输入:

_gig school level bye_

输出:

_2._

如何得到一个句子中回文词的总数?

以下是我目前编写的代码。

/*
My basic idea is: 
1) I will retrieve words from a sentence using "if(s[i] == ' ')"
2) I will check if the word is a palindrome
3) If it is a palindrome, I will add the word to the count "count++"
*/

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

int main()
{
   char s[80],temp;
   int i,j, len, count;
   count = 0;

   gets(s);
   len=strlen(s);
   j = len - 1;

   for(i = 0; i < len; i++){
   if(s[i] == ' '){
        for(;i<j;i++,j--)
        {   
            if(s[i] != s[j])
            break;  
        }
        if(i>=j)
        {
            count++;
        }
    }
    if (i == len)
        break;
}

printf("%d", count);
return 0;
}

您不应该使用 gets,它的用法已被弃用。使用 fgets。此外,您已将 j 初始化为 len-1(这是字符串的结尾),并且您正在比较当前单词的开头和字符串的结尾,而不是比较单词的结尾。你需要找到单词的结尾并检查。我对您的代码进行了一些编辑,并且能够看到所需的结果:

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

int checkPalindrome(char s[], int start, int end) {
  while(start < end) {
    if(s[start] == s[end]) {
      start++;
      end--;
    }
    else
      return 0;
  }
  return 1;
}

int main()
{
   char s[80],temp;
   int i,j, len, count, nPalindromes = 0, start;
   count = 0;

   fgets(s, 80, stdin);
   len=strlen(s);
   s[len-1] = '[=10=]';
   len--;
   j = len - 1;

   for(i = 0; i < len; ) {
     // skip whitespaces
     while(i < len && s[i] == ' ')
       i++;
     // find the other end of word
     start = i;
     while(i < len && s[i] != ' ') 
       i++;

     // check for palindrome 
     if(checkPalindrome(s, start, i-1) == 1)
       nPalindromes++;
   }

   printf("%d\n", nPalindromes);
   return 0;
}

我希望这能让您对如何解决这个问题有所了解。

给我们一个解决方案。我将句子标记为单词,然后我有一个函数来检查每个单词是否是回文,如果是,我增加计数器。

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

int isPalidrome(char * word, int length) {
    int i;

    for(i = 0; i < length / 2; i++) {
        if(word[i] != word[length - i - 1]) {
            return 0;
        }
    }

    return 1;
}

int main()
{
    char sentence[] = "gig school level bye";
    char * token = NULL;
    int count = 0;

    token = strtok(&sentence[0], " ");

    while(token != NULL) {
        if(isPalidrome(token, strlen(token))) {
            count++;
        }

        token = strtok(NULL, " ");
    }

    printf("%d", count);
    return 0;
}

你的逻辑不正确。我已经按照您的风格编写了代码,现在您可以轻松理解其中的内容并在任何需要的地方直接使用此代码。

检查此代码

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

int main()
{
  int i,j,k,l,len,count = 0;
  char s[80];

  gets(s);
  len = strlen(s);

  for(i=0;i<len;i++)
  {
    if(s[i] != ' ' || s[i] != '\n')
    {
      for(j=i;j<len;j++)
      {
          if(s[j] == ' ' || s[j] == '\n')
            break;
      }
    }

    for(k=i,l=j-1;;)
    {
      if(s[k] != s[l])
        break;
      else if(k >= l)
      {
        count = count + 1;
        break;
      }
      else
      {
        k = k + 1;
        l = l - 1;
        continue;
      }
    }

    i = j;
  }

  printf("\n%d",count);
  return 0;
}