Как я могу проверить, были ли предыдущие 2 getchars пробелом? - PullRequest
0 голосов
/ 09 апреля 2020

Мой код читает текстовый файл или ввод с терминала и печатает сообщение, но с каждым словом в новой строке приведенный ниже код работает, за исключением двойных или более пробелов.

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

Пример ввода:

Hello world this is great

Текущий вывод:

Hello
world
this
is
great

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

, например

input: hello world  how are 
                  ^^(two spaces)
output:
hello
world
        < (I want this gap gone)
how
are

#include <ctype.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int c;                          //next character



    while (1) {
        c = getchar();
        if (c == EOF){ break; }  // Exit the loop if we receive EOF ("end of file")
        if (ispunct(c)|| isdigit(c) || c== '\n') //ignores numbers and punnctuation
            continue;



        if (isspace(c)) {   // if there is a space end of word has been reach output the word
            printf("\n");
            continue;

        }
        usleep(200000); // delay between each word
        putchar(c);

    }
}

1 Ответ

0 голосов
/ 09 апреля 2020

Вам нужна еще одна переменная, чтобы запомнить, какой был предыдущий символ, чтобы вы могли различить guish окончание слова и пропустить дополнительные разделители, пока не встретится новое слово.

В фрагмент ниже я назвал эту переменную "pcwaswsp". Код скопирован из вашего, с двумя модификациями: 1) новая переменная и 2) я переместил проверку слов сразу после чтения.

int c;         // current character
int pcwassp;  // "previous character was space"

pcwassp = 0;  // previous char is not a space

while (1) {
  c = getchar();
  if (c == EOF) break;  // no more data
  // optional: if (pcwassp==2) pcwassp=isspace(c);

  // word separation
  if (isspace(c)) {
    if (!pcwassp)
      printf("\n");   // break line only on new word separator
    pcwassp = 1;      // ...but this char IS a space
    continue;
  } // else...

  pcwassp=0;   // ...else, this char is not a space

  //ignores numbers and punctuation
  ...
}

Этот код напечатает новую строку, если его ввод начнется с разделителем. Чтобы исправить это, переменную pcwassp можно инициализировать специальным значением (не 0 и не 1), имеющим значение «первый раз». В цикле, только в первый раз, эта переменная может быть установлена ​​на «предыдущий символ был разделителем» (если текущий символ является пробелом), чтобы вывод первой строки не был пустым.

...