关于sscanf的困惑

时间:2011-03-11 19:24:11

标签: c scanf

我想从一行文件中读取浮点数(以及之后的整数)。当我调试它时,我可以看到它从文件中删除线条没有问题,但是当我尝试sscanf它时,我会得到垃圾。这是我的代码:

    while(fgets(line, 1000, file) != EOF)
    {
        //Get the first character of the line
        c = line[0];

        if(c == 'v')
        {
            sscanf(line, "%f", &v1);
            printf("%f", v1);
        }
    }

v1中存储的值是垃圾。为什么这不起作用,我如何从这一行中获得浮动和整数?

4 个答案:

答案 0 :(得分:5)

你在sscanf的调用中包含第一个字符(即'v'),因此调用失败并且v1保持不变(其中包含垃圾)。试试这个:

sscanf(line+1, "%f", &v1);

答案 1 :(得分:2)

据推测v1是漂浮物?

在这种情况下,在内存中打印一个浮动就像是一个'c'字符串一样会很糟糕。
您可能想尝试printf("%f",v1);

    if(c == 'v')
    {
        sscanf(line, "%f", &v1);

如果行以'v'开头,那么你是将它发送给scanf并要求它将其转换为浮点数?你可能想要移动一个字符(或者如果你有其他填充,则更多),然后开始在第[1]行读取浮点数?

答案 2 :(得分:1)

您的printf语句应如下所示:

printf("%f\n", v1);

另外,你应该检查sscanf的返回值,检查它是否找到并存储浮点数:

if(sscanf(line, "%f", &v1) < 1){
    /* didn't read float */
}else{
    printf("%f\n", v1);
}

答案 3 :(得分:1)

由于您知道在执行sscanf()调用时line中的第一个字符是字母'v',您还可以告诉sscanf()无法成功将其转换为doublefloat,因为'v'不是以字符串形式显示的任何有效浮点数的一部分。

您应该检查sscanf()的返回值;它会说0(没有成功的转换),从而告诉你出了问题。

你可能会成功:

if (sscanf(line+1, "%f", &v1) != 1)
    ...error...