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

标签 c arrays loops getchar

在我输入消息并且数组被填充后,循环将不会退出,它会返回到需要更多输入的状态。我的问题是,当用户完成输入消息并且数组已填充时,如何退出此循环?

#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;
}

最佳答案

C != EOF || '\n'

并没有按照您的想法行事。它计算 C != EOF 然后用 '\n' 逻辑或 that (非零,所以是真的) - 它等同于:

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

实际上需要的是:

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

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

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

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

第三,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;

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

关于c - 如何在 EOF 或 '\n' 时退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29553849/

相关文章:

c - + 在 Posix Regex 库中的用法

C代码不显示输出

javascript - 如果数组为空则转义以避免错误

java - 什么是NumberFormatException,我该如何解决?

python - 循环数据帧列和循环变量

c - XC8 收到 “undefined symbols” 错误,涉及 PIC18 上的 plib I2C 函数

c - for循环内和for循环外递增

javascript - 从数组中获取不同的重复项

java - 查找素数

vba - 在文本末尾添加一个字符并将字母 A 增加到 B