2012-04-14 161 views
1

我写了下面的代码:与fgets()不等待输入

int N; 
scanf("%d", &N); 
int i; 
for (i = 0; i < N; i++) { 
    char line[LINE_MAX]; 
    if (fgets(line, LINE_MAX, stdin) != NULL) { 
    // do stuff with line here 
    printf("%c - %c\n", line[0], line[1]); 
    } 
} 

我有拥有它的行数的输入文件,然后行的这个数字其次,我要处理。所以我读到N的行数。在那之后,我使用fgets来让这条线能够处理它。

然而,fgets似乎并没有等待标准输入的第一次。我总是得到-的输出,然后等待输入。意思是,循环的第一次迭代,它不是在fgets等待标准输入和刚打印出由-分开,我printf做两个空字符。

这是为什么?我怎样才能让fgets每次都等待输入?我觉得这是一个线程问题。

回答

4

作为geekosaur表示,你没有处理scanf留下的换行符。您可以通过修改scanf格式字符串,考虑到这一点:

scanf("%d *[^\n]", &N); 

*[^\n]说无视你整数输入不是一个换行符之后的一切,但不要做与换行符(跳过)任何东西。

测试程序输出:

[email protected]:~/testing$ ./test2 
3 
13 
1 - 3 
26 
2 - 6 
59 
5 - 9 
+0

但这仍然留下了新行未读,这意味着它的()'通过以下'与fgets读的第一件事,这通常不是什么打算。 – geekosaur 2012-04-14 20:46:58

2

它无关线程。 scanf()正确地读取您要求的内容;它将所有其他内容都保留为未读,特别是数据后面的换行符。 (您也没有处理用户未输入您想要的内容的可能性。)

如果要执行面向行的输入,请使用fgets()。不要使用scanf(),并希望系统可以神奇地直觉,你想忽略你没有阅读的内容。

+0

我完全忘了换行。谢谢 – darksky 2012-04-14 19:38:56

+0

由于某种原因,我创建了一个大小为1的char数组来放置int,因此:'char Nc [1]'和'fgets(Nc,1,stdin)',但是'fgets'不会等待阅读任何东西。该计划刚刚存在。 – darksky 2012-04-14 19:43:44

+0

@Nayefc:你仍然可以使用scanf。看到我的答案。 – 2012-04-14 20:43:28

1

你可以只在scanf函数(之后,要fflush()的调用)是这样的:

int N; 
scanf("%d", &N); 
fflush (stdin); 
int i; 
... (rest of code)... 

因此,从stdin缓冲区和删除换行符GES接下来fgets()将停止询问输入。

+0

这么多!由于scanf&fgets的原因,我把头撞到墙上... – 2014-06-18 03:12:11