【问题标题】:How to clear buffer in receiving multiple strings?如何在接收多个字符串时清除缓冲区?
【发布时间】:2013-07-11 19:50:06
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

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;
}

【讨论】:

  • 如果输入的前 10 个字符中有 '\n' 怎么办?
  • @JimBalter 感谢您指出这一点。进行了必要的编辑。
  • 仍然,您不测试来自fgets 的返回;您可以访问未初始化的str1(例如用于空输入)。
  • @Jens 感谢您的提醒。修好了。
  • @NithinBhaskar 是 ` ; `在故意循环之后?如果我在这里遗漏了一些愚蠢的东西,请清除我
【解决方案2】:

另一种方式:避免使用 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;
}

【讨论】:

    【解决方案3】:
    #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 个字符怎么办……这种情况发生的可能性很大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2012-10-12
      • 2021-03-04
      • 2011-01-15
      相关资源
      最近更新 更多