所以基本上,使用C,我试图将文件中的信息读入链接列表,当只有价格是浮点数并且大小是字符串时,我才能使用它,但我需要读取大小作为浮动。 我正在读这样的文件
fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);
并且文件的结构是这样的
bottle-0.33:0.10
bottle-0.50:0.20
bottle-1.50:0.40
现在我尝试用
检查结果printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);
它打印这样的一切
bottle 0.33 8290796282473829.00
:0.10
bottle 0.50 2572489705689592000000000000000000000000000000000000000.00
:0.20
bottle 1.50 0.00
:0.40
任何人都知道出了什么问题?
答案 0 :(得分:3)
代码使用了错误的格式@BLUEPIXY
// bottle-0.33:0.10
fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);
"%[^-]"
匹配"bottle"
并将文字保存在pLog->name
"-"
匹配"-"
并继续扫描
"%f"
与"0.33"
匹配,并在pLog->size
中保存值0.33
"["
与":"
不匹配,因此扫描停止,函数返回2.
剩余格式"^:]:%f\n"
无关紧要。
使用正确的格式,宽度限制和检查结果。
// assume sizeof pLog->name is 10
if (fscanf(file,"%9[^-]-%f:%f\n", pLog->name, &pLog->size, &pLog->price) == 3)
Success();
}
答案 1 :(得分:1)
您也可以通过将指针传递给printf()
来表示错误。
printf("%s %.2f %.2f\n", pLog->name, &pLog->size, &pLog->price);
应该是
printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);
^^^ ^^^
FWIW,为格式说明符提供不匹配的参数会调用undefined behavior。
另外,要匹配"bottle-0.33:0.10"
之类的输入,像"%[^-]-%f:%f"
这样的格式说明符也足够了。
也就是说,它始终需要检查scanf()
和家庭电话的返回值,以便验证成功。否则,您可能最终会使用一些未初始化的值,这可能会再次导致UB。
答案 2 :(得分:1)
您忘记检查fscanf
的返回值。否则将会发生的事情非常明显。
始终检查您呼叫的功能的返回值。