Как я могу написать слова в обратной строке? - PullRequest
0 голосов
/ 02 апреля 2020

У меня возникли проблемы со следующим упражнением в моей книге:

Напишите программу, которая предлагает пользователю ввести последовательность слов, разделенных пробелами, а затем печатает слова в обратном порядке. , Считайте ввод как строку, а затем используйте strtok, чтобы разбить его на слова.

Input:hi there you are cool
Output: None it shuts itself.
Expected:cool are you there hi

Моя программа только получает строку и ждет и завершает работу через пару секунд. Вот код:

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

int main(void){
    int ch ;
    char * str , * str2;
    char * p;
    str = (char*)malloc(sizeof(char) * 100);
    str2 =(char*)malloc(sizeof(char) * 100);

    if((fgets(str , sizeof(str) , stdin)) != NULL){
        str = strtok(str ," \t");
        p = strrchr(str , '\0');
        strcat(str2,p);
        printf("%s",p);
       while(str != NULL){
          str = strtok(NULL ," \t");
          p = strrchr(str + 1, '\0');
          strcat(str2,p);
          printf("%s",p);
       }
    } 

    return 0;
}

Я знаю, что этот вопрос был задан здесь . Я понял идею, но моя проблема - реализация и реализация. Это скорее вопрос для начинающих.

1 Ответ

1 голос
/ 02 апреля 2020

Так как вы сами заявили, что это для упражнения, я не буду предоставлять рабочее решение, но в общих чертах описываю, что вы, возможно, захотите сделать.

Функции, которые вы хотите использовать:

  • getline - для удобного чтения строки ввода (обратите внимание, что символ новой строки не будет удален
  • strtok_r для получения токенов ( то есть слова) из входной строки
    • _r означает, что эта функция является входящей, что означает, что она может вызываться несколькими потоками одновременно. Нормальная версия имеет внутреннее состояние и strtok_r позволяет вам управлять этим состоянием с помощью параметра.

(Пожалуйста, прочитайте документы по этим функциям, если у вас есть дополнительные вопросы)

Для Алгоритм: используйте getline, чтобы прочитать одну строку из ввода и заменить символ новой строки символом 0. Затем вы должны извлечь все один токен за другим из ввода и сохранить их в стек , как в моде После Если вы токенизировали входные данные, просто извлеките токен из стека и распечатайте их в stdout.

Другой подход:

Напишите функцию, которая просто переворачивает строку. Затем используйте эту функцию для обратного ввода входной строки, а затем для всех токенов, чтобы прочитать токен из обращенной входной строки и распечатать обратный токен в stdout.

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