Найти все палиндромы в строке, используя C - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь использовать C, чтобы напечатать все палиндромы в строке и вернуть общее число.

Мой код возвращает все виды подстрок, которые не являются палиндромами и печатными пробелами.

Я не согласен хотя бы с одним в форматировании моего оператора printf, но также и в моих сравнениях элементов массива он работает наоборот, как я и предполагал.

Может кто-нибудь увидеть, куда я идуне так?

Вот мой код:

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

char x[1000];

void getString(char *n)
{
  printf("\nPlease enter your string: ");
  scanf("%s", n);
}

int findPals(char *s)
{
  int length = strlen(s);
  int numPals = 0;

  //find odd palindromes
  for(int i = 0; i < length; i++)
  {
    for(int j = 0; j + i < length && i - j >= 0; j++)
    {
      if(s[i + j] != s[i - j])
        continue;
      else
      {
        numPals++;
        printf("%.*s\n", (j - i),s + i);
      }
    }
  }

  //find even palindromes
  for(int i = 0; i < length; i++)
  {
    for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
    {
      if(s[i + j + 1] != s[i - j])
        continue;
      else
      {
        numPals++;
        printf("%.*s\n", (j - i),s + i);
      }
    }
  }
  return numPals;
}

int main()
{
  char inStr[1000];
  int totalPals;

  getString(inStr);
  totalPals = findPals(inStr);
  printf("I found %d palindromes.\n", totalPals);

  return 0;
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Спасибо за помощь.Вот моя последняя программа.

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

char x[1000];

void getString(char *n) 
{
  printf("\nPlease enter your string: "); 
  scanf("%s", n); 
}

int findPals(char *s) 
{
  int length = strlen(s);
  int numPals = 0;

  //find odd palindromes  
  for(int i = 0; i < length; i++)
  {
    for(int j = 0; j + i < length && i - j >= 0; j++)
    {   
      if(s[i + j] != s[i - j]) 
        break;
      else
      {   
        if ((j + j) > 1)
        {   
          numPals++;
          printf("%.*s\n", ((2 * j) + 1), &s[i - j]);
        }   
      }   
    }   
  }

  //find even palindromes
  for(int i = 0; i < length; i++)
  {
    for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
    {   
      if(s[i + j + 1] != s[i - j]) 
        break;
      else
      {   
        if ((j + j) > 1)
        {   
          numPals++;
          printf("%.*s\n", ((2 * j) + 2), &s[i - j]);
        }   
      }   
    }   
  }
  return numPals;
}

int main()
{
  char inStr[1000];
  int totalPals;

  getString(inStr);
  totalPals = findPals(inStr);
  printf("I found %d palindromes.\n", totalPals);

  return 0;
}
0 голосов
/ 15 октября 2018

В вашем коде требуется только 2 небольших исправления (приведенных ниже), за исключением того, что все в порядке: -

1. Оператор продолжения в проверке массива должен быть изменен на разрыв:

for(int i = 0; i < length; i++)
{
  for(int j = 0; j + i < length && i - j >= 0; j++)
  {
    if(s[i + j] != s[i - j])
      break; // continue statement has been changed to break;
    else
    {
      numPals++;
      printf(".*s\n",(2*j)+1,&s[i-j]); // The length of the string has been modified
    }
  }
}
Неверная длина строки в printf.

Для нечетного сечения:

printf(".*s\n",(2*j)+1,&s[i-j]);

И для четного сечения:

printf(".*s\n",(2*j)+2,&s[i-j]);
...