как ввести /n в программу, которая использует getchar() (и прочая путаница)

Я признаю, что это довольно вольное название.

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

Спецификация программы неоднозначна: означает ли «полностью пустые строки»
строки, которые не содержат никаких символов, кроме новой строки, или она включает строки, состоящие из пробелов и табуляции, за которыми следует новая строка? Здесь используется последняя интерпретация.

Поэтому он говорит, что код должен удалять пустые строки, но я не думаю, что это так, по крайней мере, когда я его запускаю. И я не знаю, как вы могли бы ввести новую строку в качестве ввода, потому что, когда вы нажимаете клавишу ввода, она не пропускает строку, она принимает ваш ввод и продолжает запускать программу. Он продолжает упоминать «пробелы и табуляторы, за которыми следует новая строка», но снова ... что такое новая строка, когда ввод просто запускает программу? И если вы попытаетесь оставить строки пустыми, просто нажав табуляцию или пробел, программа не удалит эти строки, а распечатает ту же пустую строку, поэтому я действительно не знаю, что делает его программа или что он говоря о.

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

#define MAXQUEUE 1001

int advance(int pointer)
{
  if (pointer < MAXQUEUE - 1)
    return pointer + 1;
  else
    return 0;
}

int main(void)
{
  char blank[MAXQUEUE];
  int head, tail;
  int nonspace;
  int retval;
  int c;

  retval = nonspace = head = tail = 0;
  while ((c = getchar()) != EOF) {
    if (c == '\n') {
      head = tail = 0;
      if (nonspace)
        putchar('\n');
      nonspace = 0;
    }
    else if (c == ' ' || c == '\t') {
      if (advance(head) == tail) {
        putchar(blank[tail]);
        tail = advance(tail);
        nonspace = 1;
        retval = EXIT_FAILURE;
      }

      blank[head] = c;
      head = advance(head);
    }
    else {
      while (head != tail) {
        putchar(blank[tail]);
        tail = advance(tail);
      }
      putchar(c);
      nonspace = 1;
    }
  }
  return retval;
}

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

0 ответов

Другие вопросы по тегам