如何在 EOF 或 '\n' 时退出循环?

How to make a loop exit when EOF or '\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;
}

检查以下更改

while( counter <MAX && ((C = getchar()) != EOF && C != '\n'))
{
  characterArray[counter++] = C;
}
C != EOF || '\n'

并不像你想象的那样。它评估 C != EOF 然后逻辑或 that'\n' (非零,所以真实) - 它等同于:

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

实际上需要的是:

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

另外三点。首先,您还应该检查以确保 counter 不超出数组的末尾,以免您受到未定义行为的影响。

其次,如果您打算将该缓冲区视为字符串,请确保以 null 终止它。它在 this 代码段中并不重要,因为您什么都不做。如果您 do 将它用作字符串,甚至可能没有必要,例如,如果您只获取一次数据(因为初始化是零填充缓冲区)。

但是,如果您接受的输入多于行,您应该将其作为输入操作的一部分终止。

第三,C 应该是 int 而不是 char。这样做的原因是 getchar() 需要能够 return 任何字符 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] = '[=13=]';

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

    return 0;
}

或者,您可以将 for 循环替换为:

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

这使用 && 的短路特性来确保在测试下一个条件之前满足每个条件。