[英]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。
这种方法有一些问题:
char
是'\\n'
,则scanf()
会将其放回stdin
而不会改变buf
! buf
保持原样 - 也许是未初始化的 。 scanf()
然后返回0。 '\\n'
,则将其保存到buf
和更多char
直到出现'\\n'
。 一个'\\0'
被附加到buf
并且'\\n'
被放回到stdin
而scanf()
返回1.这个无限制可以很容易地溢出 buf
。 如果没有保存char
并且发生EOF
或输入错误,则scanf()
返回EOF
。 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.