关于sscanf的困惑

关于sscanf的困惑,c,scanf,C,Scanf,我想从文件中获取的行中读取浮点(以及之后的整数)。当我调试它时,我可以看到它正在从文件中取出行没有问题,但是当我尝试sscanf它时,我得到的是垃圾。这是我的密码: while(fgets(line, 1000, file) != EOF) { //Get the first character of the line c = line[0]; if(c == 'v') { sscanf(l

我想从文件中获取的行中读取浮点(以及之后的整数)。当我调试它时,我可以看到它正在从文件中取出行没有问题,但是当我尝试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中存储的值是垃圾。为什么这不起作用,我怎样才能从这行中得到浮点和整数

假设v1是一个浮点数

在这种情况下,在内存中打印一个浮点数,就好像它是一个“c”字符串,这将是不好的。
您可能需要尝试
printf(“%f”,v1)


如果行以“v”开头,那么您要将其发送给scanf并要求它将其转换为浮点?您可能希望在字符上移动(如果有其他填充,则移动更多字符),然后开始读取第[1]行的浮点值?

您的printf语句应该如下所示:

printf("%f\n", v1);
此外,还应检查sscanf的返回值,以检查它是否正在查找和存储浮点:

if(sscanf(line, "%f", &v1) < 1){
    /* didn't read float */
}else{
    printf("%f\n", v1);
}
if(sscanf(第%f行和第v1行)<1){
/*我没读过浮动*/
}否则{
printf(“%f\n”,v1);
}

您在对sscanf的调用中包含了第一个字符(即“v”),因此调用失败,
v1
保持不变(其中包含垃圾)。请尝试以下方法:

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

因为您知道在执行
sscanf()
调用时,
行中的第一个字符是字母“v”,所以您也可以判断
sscanf()是不可能的
可以成功地将其转换为
双精度
浮点
,因为“v”不是以字符串形式表示的任何有效浮点数字的一部分

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

您可以通过以下方式获得成功:

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

哈哈,谢谢。但无论如何,这只是为了调试。我真正的问题是v1装垃圾。你知道我该如何解决这个问题吗?在实际代码中,如果你有strtod(),你应该使用它-如果字符串不是有效的浮点,它可以标记。查看代码,您需要跳过行首的“v”,然后将第[1]行发送到sscanf()。谢谢您的回复,您的解释非常清楚。如果我做了像sscanf(第%s%f行,v1)这样的事情,那会好吗?@Jeff:如前所述,no-
sscanf()
会尝试将字符串复制到浮点,这会很可怕。可能有效的方法是
sscanf(行“%*s%f”、&v1)其中最重要的
*
表示“进行转换,但不要将其分配到任何地方”。请注意,
%*s
将跳过一系列非空白字符。如果输入字符串为
v3.1416
(“v”后面的空格),则此操作正常;如果输入是
v3.1416
v+3.1416
(无空格),则该数字将作为字符串的一部分使用。@Jeff-这将由于几个原因而崩溃。首先,您传递的是
v1
,而不是
&v1
。第二,您指定了两个格式转换,但只提供了一个放置它们的位置。您可以使用
sscanf(第行,“v%f”和&v1)
。在我发布(并测试)之后,我意识到它只会将其放入字符串中。*似乎相当有用,在这种情况下可以使用,因为v后面有空格,但我认为这里的行+1是更好的解决方案@泰德·霍普:是的,这实际上可能比使用%*s%fAnd要好,v1是垃圾,因为它未初始化。检查sscanf是否实际初始化了您给它的参数,
if(sscanf(第+1行、%f“、&v1))=1) {//error}
if (sscanf(line+1, "%f", &v1) != 1)
    ...error...