如果我输入str1
的长度超过 10,则其余部分将保留在缓冲区中并输入到我的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;
}
如果我输入str1
的长度超过 10,则其余部分将保留在缓冲区中并输入到我的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;
}
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;
}
另一种方式:避免使用 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;
}
#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 个字符怎么办……这种情况发生的可能性很大。