如何在C中读取输入

时间:2015-06-17 01:56:58

标签: c scanf

我正在尝试用scanf("%[^\n]")读取一行;就在它之前,我正在读一个带有“%d”的整数,有人告诉我,scanf在阅读后不会删除'\ n',所以我必须调用fflush()来避免它,但即便这样做我仍然有同样的问题,所以这是我的代码:

scanf("%d", &n);
fflush(stdin);

lines = (char**)malloc(sizeof(char*)*n);

for(i = 0; i < n; i++){
    lines[i] = (char*)malloc(sizeof(char)*1001);
}

for(i = 0;i < n;i++){
    scanf("%[^\n]", linhes[i]);
}

我读了一个整数,然后scanf没有等待,它开始读取输入 - 无论整数值是什么,无论是5还是10,scanf都会读取所有字符串为空。已经尝试了fgets,结果几乎相同,只是它读取了一些字符串并跳过其他字符串。

2 个答案:

答案 0 :(得分:2)

让我们一步一步地看一下:

  

“...用scanf读取一行(”%[^ \ n]“);”。

scanf("%[^\n]", buf)没有读一行。它几乎 - 有时 - 。 "%[^\n]"指示scanf()读取任意数量的非'\n' char,直至遇到一个'\n'然后将其放回stdin)或EOF发生。

这种方法存在一些问题:

  1. 如果第一个char'\n',则scanf()会将其重新置于stdin而不会更改buf!保留buf - 可能未初始化scanf()然后返回0.
  2. 如果至少读取了一个非'\n',则会将其保存到buf以及char,直到'\n'出现。 '\0'附加buf'\n'重新加入stdinscanf()返回1.此无限制可轻松溢出< / strong> buf。如果未保存char且发生EOF或输入错误,则scanf()会返回EOF
  3. 请务必检查scanf() / fgets()等函数的返回值。如果您的代码未对其进行检查,则buf的状态未知。
  4. 在任何情况下,'\n'通常仍留在stdin中,因此未完全读取。这个'\n'通常是 next 输入函数的问题。

      

    ... scanf在读取

    后不会删除'\ n'

    另一种常见的误解。 scanf()根据提供的格式读取'\n'或不读取'\n'。有些格式消耗fflush(stdin),有些则不消耗。

      

    ...调用fflush()来避免它

    stdin在某些编译器中定义明确,但不符合C标准。通常的问题是代码想要消除'\n'中的任何剩余数据。当线路末端尚未发生时,一个常见的替代方案是读取并处置,直到找到int ch; // Use int while ((ch = fgetc(stdin)) != '\n' && ch != EOF);

    char buf[sizeof lines[i]];
    if (fgets(buf, sizeof buf, stdin) == NULL) return NoMoreInput();
    
    // If desired, remove a _potential_ trailing \n
    buf[strcspn(buf, "\n")] = 0;
    
    strcpy(lines[i], buf);
    
      

    我仍有同样的问题

    最佳解决方案IMO是读取用户输入的,然后进行扫描。

    {{1}}

    我建议缓冲区大小应该是典型代码预期输入大小的2倍。强大的代码,而不是此代码段,将检测是否需要读取更多行。国际海事组织,这种过长的线路往往是黑客的标志,而不是合法使用。

答案 1 :(得分:0)

评论中的 BLUEPIXY回答了我的问题:

  

尝试"%[^\n]"更改为" %[^\n]"