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

как я могу добиться, чтобы инструкция

 printf(" ");

была запущена и цикл завершился?Я должен написать программу для моего курса, которая заменяет все табуляцию и пробел одним пробелом.

#include <stdio.h>

int main() 
{
    int a;

    while (a != EOF) 
    {
        a=getchar();
        while (a==" " || a=="\t")
            a=EOF;
        /*I want to put printf(" "); here */
        putchar(a);
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Что касается вашего вопроса, я думаю, что ваш опубликованный код не скомпилируется, или maby скомпилирует, но с предупреждениями.

Давайте пройдемся по нему:

int a;
while (a != EOF)

Здесь вы получаете доступ a без инициализации, это может привести к непредсказуемому поведению вашей программы, вам, вероятно, лучше написать что-то вроде:

int a = getchar();
while (a != EOF)

Next:

while (a==" " || a=="\t")

a имеет тип int, в то время как "" указывает на завершающуюся нулем строку в C и рассматривается как указатель памяти, в которой хранится эта строка.сравнивать символ с указателем не очень хорошая идея :).Вы имели в виду сравнение a с пробелом или табуляцией как одиночного символа.Это должно быть сделано с помощью '':

while (a==' ' || a=='\t')

Так что теперь мы получаем

while (a==' ' || a=='\t')
    a=EOF;

Этот цикл будет выполняться до тех пор, пока a либо табуляция или пробел, но то, что находится втело петли?a = EOF;, поэтому поток сразу же выйдет из цикла while на следующей итерации.Я предполагаю, что вы имели в виду читать входные данные и переходить вперед, если входные данные являются либо пробелом, либо табуляцией, поэтому вам, вероятно, придется читать ввод через getchar()

while (a==' ' || a=='\t')
    a = getchar();

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

while ((a != EOF) && (a==' ' || a=='\t'))
    a = getchar();

Теперь, когда вы выходите из этого цикла whileв отличие от текущего кода, перед печатью a вам необходимо проверить, были ли у вас пробелы или символы табуляции перед этим, а затем распечатать одну вкладку, прежде чем печатать значение в a.Как (?), согласно вашему первоначальному вопросу , пара вариантов: printf(" "); или putchar(' ');, выберите то, что вам нравится больше всего.А также вы не хотите печатать a, если он содержит EOF, верно?Я оставлю эту часть вам для правильной реализации.

Надеюсь, это помогло и удачи.

0 голосов
/ 03 октября 2018

Ваша программа неверна по нескольким причинам:

  • a унифицируется при первом сравнении с EOF, поэтому поведение не определено.
  • вы не можете осмысленносравнить символ a со строкой " ".Сравните a с символьной константой с одинарными кавычками: a == ' '.
  • вы не читаете дополнительные символы при обнаружении пробела или табуляции
  • вы хотите печатать пробел только при наличииявляется последовательностью пробелов.

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

Вот пример:

#include <stdio.h>

int main() {
    int c;
    int insert_space = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t') {
            insert_space = 1;
        } else {
            if (insert_space) {
                putchar(' ');
                insert_space = 0;
            }
            putchar(c);
        }
    }
    if (insert_space) {
        /* there are spaces and/or tabs at the end of the last line
         *  of the file, which is not newline terminated. It might be
         *  a good idea to remove these completely.
         */
        putchar(' ');
    }
    return 0;
}

При запуске с собственным исходным кодом в качестве входа вывод:

#include <stdio.h>

int main() {
 int c;
 int insert_space = 0;

 while ((c = getchar()) != EOF) {
 if (c == ' ' || c == '\t') {
 insert_space = 1;
 } else {
 if (insert_space) {
 putchar(' ');
 insert_space = 0;
 }
 putchar(c);
 }
 }
 if (insert_space) {
 /* there are spaces and/or tabs at the end of the last line
 * of the file, which is not newline terminated. It might be
 * a good idea to remove these completely.
 */
 putchar(' ');
 }
 return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...