Как сделать выход из цикла, когда EOF или '\n'?

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

#include <stdio.h>

#define MAX 100

int main(void){

int counter = 0;
char C, characterArray[MAX] = {0};

printf("Enter a message: ");

for (C = getchar(); C != EOF || '\n'; C = getchar()){

    characterArray[counter++] = C;
}
return 0;
}

2 ответа

Решение
C != EOF || '\n'

не делает то, что вы думаете, что делает. Оценивает C != EOF тогда логическое ИЛИ, что с '\n' (который ненулевой, так что верно) - это эквивалентно:

(C != EOF) || '\n'

Что вам на самом деле нужно:

(C != EOF) && (C != '\n'))

Три других пункта. Во-первых, вы должны также убедиться, что counter не за пределами конца массива, чтобы не стать причиной неопределенного поведения.

Во-вторых, если вы собираетесь обрабатывать этот буфер как строку, убедитесь, что вы завершаете его нулем. Это не важно в этом сегменте кода, так как вы ничего не делаете с ним. Это может даже не понадобиться, если вы используете ее как строку, если, например, вы получаете данные только один раз (так как инициализация является заполнением нуля буфера).

Однако, если вы когда-либо принимаете более одной строки ввода, вы должны прекратить ее как часть операции ввода.

И в-третьих, C должен быть int а не char, Причина этого в том, что getchar() должен быть в состоянии вернуть любой символ и EOF индикатор.


Следующий код показывает один из способов сделать то, что вы хотите:

#include <stdio.h>

#define MAX 20

int main (void) {
    int c, counter = 0;
    char arr[MAX] = {0};

    printf("Enter a message: ");
    for (c = getchar();
        (c != EOF) && (c!= '\n') && (counter < MAX - 1);
        counter++, c = getchar())
    {
        arr[counter] = c;
    }
    arr[counter] = '\0';

    printf ("You entered: [%s]\n", arr);

    return 0;
}

В качестве альтернативы, вы можете заменить for цикл с чем-то вроде:

counter = 0;
while ((counter < MAX - 1) && ((c = getchar()) != EOF) && (c != '\n'))
    arr[counter++] = c;

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

Проверьте следующие изменения

while( counter <MAX && ((C = getchar()) != EOF && C != '\n'))
{
  characterArray[counter++] = C;
}
Другие вопросы по тегам