如果我输入长度超过10的str1
,其余部分将保留在缓冲区中并输入str2
。如何在str2
之前清除缓冲区,以便我可以输入它?
#include <stdio.h>
int main(void)
{
char str1[10];
char str2[10];
fgets(str1,10,stdin);
fgets(str2,10,stdin);
puts(str1);
puts(str2);
return 0;
}
答案 0 :(得分:2)
fgets(str1,10,stdin);
之后
while((c = getchar()) != '\n' && c != EOF);
这将在读取'str1'后清除输入缓冲区。
所以你的代码应该是
#include <stdio.h>
int main()
{
char str1[10];
char str2[10];
int c;
str1[0]=0;
str2[0]=0;
fgets(str1,10,stdin);
if( (str1[0]!=0) && (!strrchr(str1,'\n')) )
while((c = getchar()) != '\n' && c != EOF);
fgets(str2,10,stdin);
puts(str1);
puts(str2);
return 0;
}
答案 1 :(得分:0)
另一种方式:避免fgets(),逐个读取字符。这允许您处理一个循环内的所有条件:
int main(void)
{
char str1[12];
char str2[13];
size_t pos;
int ch;
for (pos=0;;) {
ch = getc(stdin);
if (ch == '\n' || ch == EOF ) break;
if (pos < sizeof str1 -1) str1[pos++] = ch;
}
str1[pos] = 0;
for (pos=0;;) {
ch = getc(stdin);
if (ch == '\n' || ch == EOF ) break;
if (pos < sizeof str2 -1) str2[pos++] = ch;
}
str2[pos] = 0;
printf( "str1='%s', str2=%s'\n", str1, str2);
return 0;
}
答案 2 :(得分:-1)
#include <stdio.h>
#define MAX_LEN 9
#define READBUF_LEN 4092
int main(void)
{
char str1[MAX_LEN+1];
char str2[MAX_LEN+1];
char readbuf[READBUF_LEN+1];
fgets(readbuf,READBUF_LEN,stdin);
strncpy(str1, readbuf,MAX_LEN);
str1[MAX_LEN]='\0';
fgets(readbuf,READBUF_LEN,stdin);
strncpy(str2, readbuf,MAX_LEN);
str2[MAX_LEN]='\0';
puts(str1);
puts(str2);
return 0;
}
是的,我知道,如果有人输入超过4092个字符会怎么样......这种情况发生的可能性很大。