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

Mur*_*ace 1 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;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 6

C != EOF || '\n'
Run Code Online (Sandbox Code Playgroud)

不会做你认为它做的事情.它评估那些带有(非零,真如此)的C != EOF逻辑OR - 它相当于:'\n'

(C != EOF) || '\n'
Run Code Online (Sandbox Code Playgroud)

真正需要的是:

(C != EOF) && (C != '\n'))
Run Code Online (Sandbox Code Playgroud)

其他三点.首先,您还应该检查以确保它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;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下内容替换for循环:

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

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

  • @sharon:非常肯定.OP似乎想要在行尾或文件结束时停止. (2认同)