关于sscanf的混淆

问题描述:

我想从一个文件中读取一行文本中读取浮点数(以及后面的整数)。当我调试它的时候,我可以看到它从文件中排除了没有问题,但是当我尝试sscanf时,我得到了垃圾。这是我的代码:关于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中的值是垃圾。为什么这不起作用,我怎么能从这一行中获得浮动和整数?

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

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

完美,这解决了我的sscanf问题。谢谢! – Jeff 2011-03-11 19:34:37

+1

而且,v1是垃圾因为它是未初始化的。检查sscanf是否实际初始化了你给出的参数,'if(sscanf(line + 1,“%f”,&v1))!= 1){// error}' – nos 2011-03-11 19:38:30

推测v1是浮子吗?

在这种情况下,打印内存中的浮动,如果它是一个“C”的字符串将是坏..
如果符合“V”开始你可能会想尝试printf("%f",v1);

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

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

+0

哈哈,感谢。但那只是用于调试。我真正的问题是v1持有垃圾。任何想法如何我可以解决这个问题? – Jeff 2011-03-11 19:29:52

+0

在实际的代码中,如果有的话,应该使用strtod() - 它可以标记该字符串是否不是有效的float。看代码,你需要跳过行'开头的'v'并发送行[1] sscanf() – 2011-03-11 19:31:39

你的printf语句应该是这样的:

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

此外,你应该检查的sscanf的返回值来检查它是否是即使找到和存储浮动:

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

既然你知道,当你执行sscanf()呼叫在line的第一个字符是字母“V”,你也可以告诉大家,有没有办法,sscanf()可以转换,要想成功a doublefloat,因为'v'不是以字符串形式表示的任何有效浮点数字的一部分。

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

你可能会成功有:

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

感谢您的回复,您的解释非常明确。如果我做了像sscanf(线,“%s%f”,v1)这样的事情会好吗? – Jeff 2011-03-11 19:36:57

+0

@Jeff:正如所写的,没有 - 'sscanf()'会尝试将字符串复制到可怕的浮动。可能的工作是'sscanf(line,“%* s%f”,&v1);'其中最重要的'*'表示'进行转换,但不会将其分配给任何地方'。请注意,'%* s'会如果输入字符串是'v 3.1416'('v'后面的空格),那么这将工作正常;如果输入是'v3.1416'或'v + 3。1416'(没有空格),那么这个数字将作为字符串的一部分被使用。 – 2011-03-11 19:39:54

+1

@Jeff - 这会因为几个原因而崩溃。首先,你传递'v1'而不是'&v1'。其次,你指定了两种格式转换,但只给一个地方放置它们。你可以使用'sscanf(line,“v%f”,&v1)''。 – 2011-03-11 19:40:46