我正在为.obj文件制作一个解析器。我正在使用scanf但是我得到了非常奇怪的结果。
void loader::readIn()
{
//!takes in the all the data and
//!puts in string first.
std::string myString; //!save string
float tmpX,tmpY,tmpZ; //!storing the floats in here .
while(!myFile.eof())
{
std::getline(myFile,myString); //!intake string
if(myString[0] == 'v' && myString[1] == ' ') //!check value
{
scanf_s(myString.c_str(), "v %f %f %f" ,&tmpX,&tmpY,&tmpZ);
std::cout<< tmpX <<" "<< tmpY <<" "<<tmpZ <<std::endl;
}
}
}
这是我的代码。
下面是我想要阅读的内容
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
当我提出答案时,这就是结果。
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
-1.07374e+008 -1.07374e+008 -1.07374e+008
感谢任何帮助。
答案 0 :(得分:0)
让我尽快向您解释问题。首先,正如评论者所写,您不应在C ++中使用任何scanf类型的函数。甚至在C语言中也不是。它们容易出错且不安全(网络攻击的候选人)。请使用C ++ iostream进行流的输入和输出。
然后,由于该语言存在,因此我正在用C ++进行编程。我从未听说过scanf_s。所以,哇,谢谢你让我知道。阅读文档,您甚至不需要它即可实现。您尝试读取3个浮点数,因此_s版本在这里无济于事。
然后,这是主要的错误,您使用的是scanf而不是sscanf。正如您所期望的,Scanf从标准输入而不是从字符串读取。我首先想知道为什么该功能不会阻止并等待用户输入。但是很显然为什么不这样做。您假定的输入字符串将用作格式字符串。并且,根据定义的行为,该函数不会检测格式字段并立即停止。
如果您已经检查了该函数的返回值(应该做什么),那么您将已经检测到了。
然后,您从未初始化3个float值。您应该始终初始化变量。但是现在,变量包含随机值。 scanf永远不会分配。因此,输出是随机的。
希望,我可以解释这个问题