#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char c, char_array[100];
int i = 0;
printf("Enter characters (press CTRL+D to end):\n");
while(fgets(char_array+i,sizeof(char_array)-i,stdin)) {
i = i + strlen(char_array+i);
if(char_array[i-1] == EOF)
break;
}
char_array[i-1] = '\0';
strtok(char_array,"\n");
printf("\nEnter a string:\n");
char string[100];
fgets(string,sizeof(string),stdin);
printf("\nCharacter Array: %s\n", char_array);
printf("String: %s\n", string);
return 0;
}
这是代码,我已经尝试了许多不同的变化(更简单),但它总是有同样的问题...我输入字符,按CTRL+D,它结束了没有等待我输入字符串。请帮助
我尝试了一切我可以,但我只是不能使它工作,我的朋友也不能...我有和考试,我需要这是在3天内完成最大,所以我需要所有的帮助,我可以得到。
2条答案
按热度按时间az31mfrm1#
对于stdio流,error/eof是 sticky --也就是说,一旦发生错误或eof条件,对
FILE *
的进一步操作将继续返回EOF(-1)或NULL(取决于函数),而不是尝试进一步读取或写入任何内容。要重置
FILE *
上的eof状态,需要调用clearerr(stdin)
,完成后,可以从终端读取其他输入。vjrehmav2#
fgets()
在流关闭时返回NULL
。在Linux上,如果终端缓冲区不为空,Ctrl-D将刷新终端缓冲区(但fgets()
不会返回,因为它保持行缓冲),并且需要第二个Ctrl-D来触发流的EOF状态。1.如果阵列已满,您还希望终止循环:
fgets()
不会将EOF
作为正在读取的字符串的一部分发出,因此这是完全不正确的,并且由于stdin是行缓冲的,因此如果缓冲区已满,则最后一个字符是“\n”或其他字符(如果读取了最后一个字符,则可能是-1或0xff)(无论字符是否有符号,但仍然是错误的):1.下一行:
如果数组已满(即数据丢失),则剥离最后一个字符,即
\n
或我们最后读取的任何字符。1.由于输入流处于EOF状态,第二个
fgets()
将返回NULL。您可以在调用fgets()
获取第二个字符串之前使用clearerr(stdin)
清除该状态。如果流确实结束,例如“hello world”|./your_program, the 2nd
fgets()',当然也返回NULL。我建议您使用空行来表示输入结束:
和示例会话: