Код не позволяет мне вводить и немедленно завершается

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

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`

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


person Francesca Attard    schedule 07.01.2019    source источник
comment
Используйте fgets вместо scanf.   -  person Jabberwocky    schedule 07.01.2019
comment
Возможный дубликат Scanf разрешает пробелы между словами   -  person Mathieu    schedule 07.01.2019


Ответы (2)


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

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

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

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

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

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

person kiran Biradar    schedule 07.01.2019
comment
Пытался использовать его сейчас, но это не дало мне времени ввести ввод. Вывод: Пожалуйста, введите предложение, которое вы хотите перевернуть. Процесс завершен с кодом выхода 0 - person Francesca Attard; 07.01.2019
comment
@FrancescaAttard, ты тоже забыл return от reversesentence() - person artm; 07.01.2019

У тебя две проблемы

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

Самый простой способ — читать слова с помощью 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
?

который печатает

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

person bruno    schedule 07.01.2019