2012-11-18 54 views
0
int main(){ 
    int i,j; 
    char *data = "1\n2\n"; 
    sscanf(data, "%d", &i); 
    sscanf(data, "%d", &j); 
    printf("i=%d, j=%d\n", i, j); 
    return 0; 
} 

阅读本sscanf的开始如果你<a href="http://codepad.org/6mGWfWO0" rel="nofollow">run the code</a>你会看到从begining

i=1, j=1 

为什么j=1这里?不应该是2?我错过了非常基本的东西吗?

如果我使用sscanf(data, "%d\n%d", &i, &j);它显示正确的输出。但是现在下一个sscanf调用将从头再次开始读取? 这是为什么?如何正确读取它?

+5

您指定'data'为出发点,不是吗?你还期望什么? –

+2

是的,你错过了一些非常基本的东西,你从同一个地址开始,读取一个整数*两次*并得到两次相同的值。那里没有惊喜。 –

回答

4

您的两个sscanf线可以改写为:

sscanf("1\n2\n", "%d", &i); 
sscanf("1\n2\n", "%d", &j); 

这应该是相当明显的,现在为什么都ij具有价值1sscanf无法修改data点。

使用单一sscanf呼叫提取两个标记代替:

sscanf(data, "%d\n%d", &i, &j); 
+0

在主代码中,我有许多其他令牌要读取。即使他们的长度是动态的。请参阅[this](http://pastie.org/5398470)(第76行) –

+1

@ shiplu.mokadd.im:您可以用一个'sscanf'调用来提取所有这些标记。如果你想效率低下,你可以使用'strchr'手动更新指向下一个分隔符的指针。 – AusCBloke

相关问题