我正在尝试用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,结果几乎相同,只是它读取了一些字符串并跳过其他字符串。
答案 0 :(得分:2)
让我们一步一步地看一下:
“...用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.此无限制可轻松溢出< / strong> buf
。如果未保存char
且发生EOF
或输入错误,则scanf()
会返回EOF
。scanf()
/ fgets()
等函数的返回值。如果您的代码未对其进行检查,则buf
的状态未知。在任何情况下,'\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)
尝试
"%[^\n]"
更改为" %[^\n]"