如何在 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;
这使用 &&
的短路特性来确保在测试下一个条件之前满足每个条件。
在我输入消息并且数组被填充后,循环将不会退出,它会返回到需要更多输入的状态。我的问题是当用户完成输入消息并且数组已填充时如何退出此循环?
#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;
这使用 &&
的短路特性来确保在测试下一个条件之前满足每个条件。