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

时间:2015-04-10 05:10:18

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

C != EOF || '\n'

不符合您的想法。它评估C != EOF然后逻辑OR '\n'(非零,真如此) - 它相当于:

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

实际需要的是:

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

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

其次,如果您将该缓冲区视为字符串,请确保将其终止。它在代码段中并不重要,因为您无法对其执行任何操作。如果你将它用作字符串,例如,你只获得一次数据(因为初始化是零填充缓冲区),它甚至可能不是必需的。

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

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

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

答案 1 :(得分:2)

检查以下更改

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