2013-08-28 239 views
2

我编写了一个C程序来从std输入中选择数据,该数据以一个数字开始,表示数据集的数量,然后在表单中有N对数据:(xy),所以我写的代码如下:读取数据并用scanf跳过括号

#include <stdio.h> 

int main() 
{ 
    int n_sets; 
    scanf("%d", &n_sets); 
    int i; 
    for(i = 0; i < n_sets; ++i) 
    { 
     int m, n; 
     scanf("(%d %d)", &m, &n); 
     printf("%d\t%d\n", m, n); 
    } 

    return 0; 
} 

但它不起作用。在输入数据集的编号后,程序直接打印未初始化的m & n。但是当我在(%d %d)之前添加一个空格时,它工作正常。有人可以解释这一点?

+0

1。检查从'scanf'返回的值2.使用调试器找出发生了什么问题 –

+0

这让我想起'fflush()'.. – Lucio

+0

@Lucio:从我记忆中来看,fflush在stdin上是一个仅限微软的扩展。 – zentrunix

回答

8

当您在参数scanf()的参数中有字符文字时,它期望完全按照格式字符串中的指定查找这些文字。

scanf("%d", &n_sets); 

正确地读取n_sets,并且在缓冲器中的换行或其他空白字符停止。接下来scanf()

scanf("(%d %d)", &m, &n); 

希望找到在输入的开始处的左括号,但发现一个空白字符来代替。所以它失败了,并且scanf()在没有任何读取的情况下返回。因此,您的mn保持未初始化,并且垃圾结果。

当你把空间打开括号之前,像这样:

scanf(" (%d %d)", &m, &n); 

它告诉scanf()输入缓冲区的括号之前跳过任何前导空格,所以该程序正常工作。

+0

谢谢,我明白了!清楚地说明了 – jfly

2

变化

scanf("%d", &n_sets); 

scanf("%d\n", &n_sets); 

,并输入您的n_sets用[Enter]键,它的工作结束了。

enter image description here

+0

从verbose查看上面的答案。他很好地解释了究竟发生了什么。 – Darwing

+0

@ Zenfeuer我同意并投票赞成 – vvy

+0

FYI:将“%d”更改为“%d \ n”或“%d”或“%d \ t”等将具有相同的效果。在每种情况下,格式中的空格字符都将与_any_空格匹配。 – chux

1

这听起来像输入到程序中有你想scanf函数解析值之前空白的一些量。字符串中的空格告诉scanf忽略空白。没有它,scanf正在寻找一个完全匹配。

2

假设你的输入是这样的:

2 (1 2) (3 4) 

还有就是第一个数字后面输入一个空格(或新行?),所以在循环改变scanf到:

scanf("\n(%d %d)", &m, &n); 
//  ^^ 
+0

。谢谢! – jfly