Obj Parser scanf给出了奇怪的结果

时间:2013-11-30 18:28:08

标签: c++ scanf .obj

我正在为.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

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

让我尽快向您解释问题。首先,正如评论者所写,您不应在C ++中使用任何scanf类型的函数。甚至在C语言中也不是。它们容易出错且不安全(网络攻击的候选人)。请使用C ++ iostream进行流的输入和输出。

然后,由于该语言存在,因此我正在用C ++进行编程。我从未听说过scanf_s。所以,哇,谢谢你让我知道。阅读文档,您甚至不需要它即可实现。您尝试读取3个浮点数,因此_s版本在这里无济于事。

然后,这是主要的错误,您使用的是scanf而不是sscanf。正如您所期望的,Scanf从标准输入而不是从字符串读取。我首先想知道为什么该功能不会阻止并等待用户输入。但是很显然为什么不这样做。您假定的输入字符串将用作格式字符串。并且,根据定义的行为,该函数不会检测格式字段并立即停止。

如果您已经检查了该函数的返回值(应该做什么),那么您将已经检测到了。

然后,您从未初始化3个float值。您应该始终初始化变量。但是现在,变量包含随机值。 scanf永远不会分配。因此,输出是随机的。

希望,我可以解释这个问题