2013-04-30 67 views
2

I的情况下具有以下输入:用C解析输入,scanf的

2 
2 5 
4 6 
1 
1 1 

,其中每个第一数量编码的情况下遵循的数量。这在ACM问题中很常见。我已经试过成功地使用fgets然后sscanf(我总是最终这样做:(但是出于好奇,有没有办法使用scanf?如果我做了类似的事情,文件指针最终会在哪里结束

scanf("%d",&x) 
for (f=0;f<x;f++) { 
    scanf("%d %d", &a, &b); 
} 

将这项工作,有没有用更好的方法只是scanf

+0

是的,如果输入是格式正确的,那就行了。 – 2013-04-30 00:54:55

+0

@DanielFischer:这通常都是在'while(1)'循环或类似的东西中,我怎么用第一个'scanf'测试EOF? – 2013-04-30 00:56:46

+0

呃,我想我知道了......这个'while(scanf(“%d”,&cases)== 1)'会起作用,我想......不是吗? – 2013-04-30 01:00:39

回答

2

如果输入的是良好的形成 - 因为你可以期待在线法官 - 模式你有作品

对于示例输入和循环,输入最多并包括'6'将被消耗,在此之后的新行将被下一个scanf呼叫跳过。

这是usuall所有内while(1)环或类似的东西,我怎么测试EOF与第一scanf函数?

如果你没有测试用例的数量和需要自行检测输入端,使用scanf返回值,

while(scanf("%d", &x) == 1) { 
    for(f = 0; f < x; ++f) { 
     scanf("%d%d", &a, &b); 
     /* do something clever */ 
    } 
} 

如果转换失败,你走到了尽头的输入,输入格式不正确,或输入流已损坏。在这些情况下,你都无法恢复。