Как сделать выход из цикла, когда 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;
}