2012-10-14 52 views
0

我正在使用scanf为图形输入。输入如下:scanf()给最后一行输入提供错误的输出

8 
1 2 
3 3 5 6 
2 4 7 
2 3 8 
2 1 5 
1 7 
2 6 4 
0 

第一个整数(8)是顶点数,后面跟着8行。每个中的第一个整数是第一行顶点1,第二行顶点2出来的边的数量,依此类推。

我写的功能如下:

void getInput() { 
    //init(); 
    int numVertex; int numTest; 

    scanf("%d", &numVertex); 
    for(int i =1 ; i <= numVertex;i++) { 
     int ver,nC; vector<int> vList; 
     //fscanf(file,"%d", &ver); 
     scanf("%d", &nC); 

     for(int j=0;j<nC;j++) { 
      int temp ; 
      scanf("%d", &temp); 
      vList.push_back(temp); 

     } 
     props pr = {-1,-1 , vList}; 
     graph.insert(make_pair(i, pr)); 
    } 
} 

然而,输出为我输入的最后一行变得怪异,它基本上重复了前行多次的最后一位。对于上面的输入,我得到的输出:

1 : 2 
2 : 3 5 6 
3 : 4 7 
4 : 3 8 
5 : 1 5 
6 : 7 
7 : 6 4 
8 : 4 4 // this is where it should give nothing 

谁能告诉我这里怎么了?当我转换为通过文件输入时,完全相同的转换序列为我提供了正确的输出。

有人可以请我指出任何错误?

+0

请您澄清一下您的输入格式?目前尚不清楚你的分隔线在哪里。也不完全清楚你的输出应该是什么。 – EFraim

回答

1

做这样的:

if (scanf("%d", &nC) != EOF) { 

    for(int j=0;j<nC;j++) { 
     int temp ; 
     scanf("%d", &temp); 
     vList.push_back(temp); 

    } 
    props pr = {-1,-1 , vList}; 
    graph.insert(make_pair(i, pr)); 
} 

这将检查如果读取成功。最后一行输入的重复是一个众所周知的问题,并且发生是因为上次读取尝试失败(因为文件结尾已达到)并且scanf返回与先前调用相同的结果。

+0

我认为不应该将它与EOF进行比较,但是需要预期的字段数 - 在本例中为1.在第二个scanf中相同。 – EFraim

+0

对于所提及的问题,即重复*最后*行,文件错误结束是最常见的问题。因此使用EOF。 –

+0

我建议的支票也会验证这种情况。 – EFraim

0

什么是props?不管它是什么,在包含std :: vector的东西上做C风格的结构体初始化都会遇到麻烦 - 结果是不确定的,而且几乎肯定不是你想要的结果。

尽管没有错误检查,但您的输入代码似乎还可以,正如另一个答案中所述。