Obj Parser扫描得到奇怪的结果

Obj Parser scanf giving strange results

本文关键字:结果 Parser 扫描 Obj      更新时间:2023-10-16

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

感谢您的帮助。

让我简单地向您解释一下这个问题。首先,正如评论者所写的,您不应该在C++中使用任何scanf类型的函数。甚至在C中也没有。他们容易出错,不安全(网络攻击的候选者)。请使用C++iostreams从/到流进行输入和输出。

然后,我用C++编程,因为该语言存在。我从没听说过scanf_s。所以,哇,谢谢你让我意识到这一点。阅读文档,您甚至不需要它来实现。您尝试读取3个浮动,因此,_s版本在这里对您没有帮助。

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

如果您检查了函数的返回值(应该做什么),那么您就会检测到这一点。

然后,您从未初始化过3个浮点值。您应该始终初始化变量。但现在,变量包含随机值。而且scanf从来没有赋值。因此,输出是随机的。

希望我能解释的问题