7

如果我输入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;
}
4

3 回答 3

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;
}
于 2013-07-13T10:02:20.487 回答
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;
}
于 2013-07-13T13:49:00.683 回答
-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 个字符怎么办……这种情况发生的可能性很大。

于 2013-07-13T11:56:59.313 回答