Исключение специальных символов строки останавливается на пробелах - PullRequest
0 голосов
/ 13 февраля 2019

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

IЯ пытался изменить длину цикла в функции исправления, так как я думаю, что именно в этом проблема, но из того, что я могу сказать, strlen () работает, как и ожидалось, цикл просто останавливается, когда встречает пробел.

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

#define MAX 1000 /* The maximum number of characters in a line of  
input 
*/
void fix(char str[], char str2[]);
int main()
{
  char text[MAX], text2[MAX], text3[MAX], text4[MAX], temp;
  int i, j;
  int length;

  puts("Type some text (then ENTER):");

  /* Save typed characters in text[]: */

  fgets(text, MAX, stdin);
  length = strlen(text) - 1;

  strcpy(text2, text);

  i = 0;
  j = length-1;
  while(i < j){
        temp = text[i];
        text[i] = text[j];
        text[j] = temp;
        i++;
        j--;
  }
  /* Analyse contents of text[]: */
  printf("Your input in reverse is:\n");
  printf("%s", text);

  fix(text, text3);
  printf("%s\n", text3);
  fix(text2, text4);
  printf("%s\n", text4);
  if(strcmp(text4, text3) == 0)
        printf("Found a palindrome!\n");
return 0;
}


void fix(char str[], char str2[]){
  int i;
  for(i = 0; i < strlen(str)-1; i+=1){
        if (isalpha(str[i])){
                str2[i] = tolower(str[i]);
        }
  }
}

При вводе «Медсестры, беги» обратная строка выводится корректно, но не выводится «Найден палиндром!»

При печати текста 3 и 4 печатается «нур» и«медсестры» соответственно.

Кажется, что цикл останавливается, когда он встречается с пробелом, но я не могу понять, почему, поскольку он должен идти, основываясь на длине полного ввода.

1 Ответ

0 голосов
/ 13 февраля 2019

В вашей функции fix есть проблема, которая вызывает неопределенное поведение, поскольку вы только инициализируете позиции в результирующей строке альфа-символами.

Поскольку ваше требование состоит в том, чтобы игнорировать не-буквенные символы, вам нужен дополнительный счетчик.Очевидно, i будет указывать на неправильный символ, если вам нужно удалить символы из вашей строки.Поэтому вам нужно посчитать, сколько символов вы фактически скопировали в str2.

void fix(char str[], char str2[])
{
    int i, copied = 0;
    for(i= 0; str[i] != '\0'; i++)              // See note 1
    {
        if (isalpha(str[i])) {
            str2[copied++] = tolower(str[i]);   // See note 2
        }
    }
    str2[copied] = '\0';                        // See note 3
}

Примечания:

  1. Нет необходимости вызывать strlen в каждом тесте.На самом деле, вам вообще не нужно его вызывать - это просто проверка на нулевой терминатор строки.
  2. Обратите внимание, что здесь copied увеличивается.Это гарантирует, что у вас не будет пробелов, если вы исключите символ.
  3. Вы должны не забудьте завершить новую строку нулем.
...