关于sscanf的困惑
我想从文件中获取的行中读取浮点(以及之后的整数)。当我调试它时,我可以看到它正在从文件中取出行没有问题,但是当我尝试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
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...