关于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);
推测v1是浮子吗?
在这种情况下,打印内存中的浮动,如果它是一个“C”的字符串将是坏..
如果符合“V”开始你可能会想尝试printf("%f",v1);
if(c == 'v')
{
sscanf(line, "%f", &v1);
那么你是发送到scanf并要求它将其转换为浮动?你可能想要移动一个字符(或更多,如果你有其他填充),然后开始读取行[1]处的浮点数?
哈哈,感谢。但那只是用于调试。我真正的问题是v1持有垃圾。任何想法如何我可以解决这个问题? – Jeff 2011-03-11 19:29:52
在实际的代码中,如果有的话,应该使用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 double
或float
,因为'v'不是以字符串形式表示的任何有效浮点数字的一部分。
您应该检查sscanf()
的返回值;它会说0(没有成功的转换),从而告诉你出了什么问题。
你可能会成功有:
if (sscanf(line+1, "%f", &v1) != 1)
...error...
感谢您的回复,您的解释非常明确。如果我做了像sscanf(线,“%s%f”,v1)这样的事情会好吗? – Jeff 2011-03-11 19:36:57
@Jeff:正如所写的,没有 - 'sscanf()'会尝试将字符串复制到可怕的浮动。可能的工作是'sscanf(line,“%* s%f”,&v1);'其中最重要的'*'表示'进行转换,但不会将其分配给任何地方'。请注意,'%* s'会如果输入字符串是'v 3.1416'('v'后面的空格),那么这将工作正常;如果输入是'v3.1416'或'v + 3。1416'(没有空格),那么这个数字将作为字符串的一部分被使用。 – 2011-03-11 19:39:54
@Jeff - 这会因为几个原因而崩溃。首先,你传递'v1'而不是'&v1'。其次,你指定了两种格式转换,但只给一个地方放置它们。你可以使用'sscanf(line,“v%f”,&v1)''。 – 2011-03-11 19:40:46
完美,这解决了我的sscanf问题。谢谢! – Jeff 2011-03-11 19:34:37
而且,v1是垃圾因为它是未初始化的。检查sscanf是否实际初始化了你给出的参数,'if(sscanf(line + 1,“%f”,&v1))!= 1){// error}' – nos 2011-03-11 19:38:30