Как оптимизировать чтение символов из ввода, чтобы пользователю не нужно было предварительно указывать количество символов - PullRequest
0 голосов
/ 11 сентября 2018

Текущее состояние программы

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

Вывод, который я получаю, правильный, но я хочу оптимизировать код.

В основном я написал код, который выполняет мою функцию вставки n раз (n представляет количество символов, которые хочет пользовательвход).Итак, прямо сейчас пользователю необходимо сначала ввести количество символов, которые они хотят ввести, а затем они могут ввести символы.

Как я на самом деле этого хочу

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

Мои попытки

Попытка с использованием цикла while, но получен неправильный результат:

Введено "asdf" в качестве ввода

и получено«fs» в качестве вывода

int main(){
struct Node* head = NULL;
printf("Enter the chars you want to type: ");
while (getchar() != '\n') {
head = Insert(head,getchar());
}
Print(head);
}

Попытка с использованием оператора if, но с ошибочным результатом:

Ввод «asdf» в качестве ввода

и получение «s» в качестве вывода

int main(){
struct Node* head = NULL;
printf("Enter the chars you want to type: ");
if (getchar() != '\n') {
head = Insert(head,getchar());
}
Print(head);
}

Мой код

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



struct Node {
  char data;
  struct Node* linkToNext;
};



void Print(struct Node* head){
  while (head != NULL) {
    printf("%c", head -> data);
    head = head -> linkToNext;
  }
}



struct Node* Insert(struct Node* head, char input){
  struct Node* pointerToNode = (struct Node*)malloc(sizeof(struct Node)); 
  pointerToNode -> data = input;
  pointerToNode ->linkToNext = head;
  head = pointerToNode;
  return head;
}



int main(){
  struct Node* head = NULL;
  int i, n;
  printf("Enter the amout of chars you want to type: ");
  scanf("%d", &n);
  for (i = 0; i <= n; i++) {
    head = Insert(head,getchar());
  }
    Print(head);
}

Пример результата выполнения кода

Введите сумму символов, которую вы хотитетип: 4

asdf

fdsa

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

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

void printRev(){
  char a;
  a = getchar();
  if(a == '\n'){
      return;
  }
  printRev();
  putchar(a);
}

здесь вам не нужно указывать размер ввода. Вы просто сканируете, пока не нажмете Enter, затем напечатаете во время возврата.

0 голосов
/ 11 сентября 2018

Каждый вызов getchar() читает и возвращает другой символ из стандартного ввода.

Рассмотрим, что происходит с кодом типа

while (getchar() != '\n') {
//     ^^^^^^^^^ #1

    head = Insert(head,getchar());
//                     ^^^^^^^^^ #2

}

и пользовательским вводом asdf.

Вызов с меткой # 1 читает и возвращает 'a' (первый символ ввода), который не является '\n', поэтому выполняется тело цикла.

Затем вызов с меткой # 2читает и возвращает 's' (следующий символ), который добавляется в список.

Затем мы возвращаемся к условию цикла.getchar() # 1 читает и возвращает 'd', который все еще не '\n' ...

... и getchar() # 2 читает и возвращает 'f', который также добавляется кlist.

Наконец, getchar() # 1 читает новую строку, которая завершает цикл.

Из-за двух вызовов getchar в каждой итерации, только каждый второй символ был добавлен вlist.

Ваша вторая попытка похожа, но if не является циклом, поэтому только второй символ total ('s' in asdf) был добавлен в список.

Чтобы исправить это, вам нужно сохранить возвращаемое значение getchar в переменной, чтобы вы могли сравнить его и добавить в список, не читая больше символов:

int c;
while ((c = getchar()) != '\n' && c != EOF) {
    head = Insert(head, c);
}

дополнительная проверка для EOF состоит в том, чтобы предотвратить переход вашей программы в бесконечный цикл в случае, если ввод не завершен '\n'.

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