Код не позволяет мне ввести и заканчивается немедленно - PullRequest
0 голосов
/ 07 января 2019

Я создал функцию, которая переворачивает все слова в предложении, что означает, что если вход «Hello World», то вывод должен быть «Hello World». Код ниже является функцией.

char*  reversesentence(char sent[]) {
  int lth = strlen(sent);
  int i;

  for(i = lth -1; i >= 0; i--) {
    if(sent[i] == ' ') {
        sent[i] = '\0'; 
        printf("%s ", &(sent[i]) + 1); 
    }
  }

  printf("%s", sent);
}

В основном я пытаюсь спросить пользователя о предложении и вызываю функцию в основном.

  int main(void)
  {
    char sentence[2000];

    printf("Please enter the sentence you want to be reversed.\n");

    scanf("%s", sentence);
    reversesentence(sentence);
    printf("%s", sentence);
  }

Кажется, что в массиве хранится только первое слово предложения.

Выход:

Please enter the sentence you want to be reversed.
hello my name is 
hellohello
Process finished with exit code 0`

Может кто-нибудь помочь мне исправить это, пожалуйста? В сети искал и ничего полезного не нашел.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

У вас две проблемы

  • как уже было сказано, вы читаете только одно слово, используя scanf
  • reversesentence просто замените все пробелы нулевым символом, так что даже если вы прочитаете полную строку, вы обрежете ее в первом пробеле. поэтому, если вы введете «Привет мир», результатом будет «Привет», а если вы введете «Привет мир», результатом будет пустая строка

Простой способ - читать слова, используя scanf в цикле , пока он не вернет EOF, запоминая их, чтобы в конце создать список возвращенных слов

Например:

#include <stdlib.h>
#include <string.h>

int main()
{
  size_t len = 0;
  char * result = 0;
  char word[256];

  while (scanf("%256s", word) != EOF) {
    if (result == 0) {
      result = strdup(word);
      len = strlen(word);
    }
    else {
      size_t l = strlen(word);
      char * r = malloc(len + l + 2);

      strcpy(r, word);
      r[l] = ' ';
      strcpy(r + l + 1, result);
      free(result);
      result = r;
      len += l + 1;
    }
  }

  puts(result);
  free(result);
  return 0;
}

Чтение заканчивается в конце ввода (^ d под оболочкой linux), слова могут быть даны в нескольких строках.

со входом

hello world
how
are you
?

что печатает

? ты как мир привет

0 голосов
/ 07 января 2019

scanf прекращает чтение при появлении пробелов, символов табуляции или новой строки.

Соответствует последовательности символов без пробелов; следующий указатель должен быть указатель на массив символов, который достаточно длинный, чтобы содержать входная последовательность и завершающий нулевой байт ('\ 0'), который добавляется автоматически. Строка ввода останавливается на пустом месте или на максимуме ширина поля, в зависимости от того, что произойдет раньше.

Таким образом, вы не читаете всю строку при вводе.

Попробуйте использовать fgets, как показано ниже.

fgets(sentence, sizeof(sentence), stdin); 

Примечание fgets добавляет \n к концу строки. Посмотрите, как обрезать новая строка из fgets

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...