繁体   English   中英

如何在C中读取输入

[英]How to read input in C

我正在尝试用scanf("%[^\\n]")读取一行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,结果几乎相同,只是它读取了一些字符串并跳过其他字符串。

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

“...用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.这个无限制可以很容易地溢出 buf 如果没有保存char并且发生EOF或输入错误,则scanf()返回EOF
  3. 始终检查scanf() / fgets()等函数的返回值 如果您的代码没有检查它,则buf的状态是未知的。

在任何情况下, '\\n'仍然通常留在stdin ,因此该未被完全读取。 这个'\\n'通常是下一个输入函数的问题。

... scanf在读取后不会删除'\\ n'

另一个常见的误解。 scanf()读取'\\n'或不读取,具体取决于提供的格式。 有些格式消耗'\\n' ,有些则不消耗。

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

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

int ch;  // Use int
while ((ch = fgetc(stdin)) != '\n' && ch != EOF);

我仍然有同样的问题

最好的解决方案IMO是读取一行用户输入然后扫描它。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM