C ++ string :: find崩溃应用程序

时间:2016-01-14 20:11:14

标签: c++ string find

所以我想检查我的const std::string &foo = "hello world";是否包含另一个字符串const std::string &bar = "world";

所以我尝试使用if语句:if (foo.find(bar) != std::string::npos)。没有错误但是当我启动我的应用程序时它会崩溃。当我删除该代码应用程序再次正常工作。

有人可以告诉我如何使用这个功能吗?

我试图找到原因,另一个教程,但我的代码似乎没问题。是的,我确定我在某个地方犯了错误。

编辑:

代码:

#include "modelLoader.h"

#include <iostream>
#include <fstream>
#include <algorithm>
#include <strstream>
#include <string>

ModelAsset *ModelLoader::loadOBJModel(FilePath *objFile)
{
ModelAsset *model = new ModelAsset();

std::ifstream file(objFile->getPath());

std::vector<std::string*> lines;

std::string tempLine;

while(std::getline(file, tempLine))
{
    lines.push_back(&tempLine);
}

for(U32 i = 0; i < lines.size(); i++)
{
    if((*lines[i])[0] == '#') continue;
    else if((*lines[i])[0] == 'v' && (*lines[i])[1] == ' ')
    {
        F32 tempX, tempY, tempZ;
        sscanf(lines[i]->c_str(), "v %f %f %f %f", tempX, tempY, tempZ);

        model->verticles.push_back(new Vector3(tempX, tempY, tempZ));
    }
    else if((*lines[i])[0] == 'v' && (*lines[i])[1] == 'n')
    {
        F32 tempX, tempY, tempZ;
        sscanf(lines[i]->c_str(), "vn %f %f %f %f", tempX, tempY, tempZ);

        model->normalVectors.push_back(new Vector3(tempX, tempY, tempZ));
    }
    else if((*lines[i])[0] == 'v' && (*lines[i])[1] == 't')
    {
        F32 tempX, tempY, tempZ;
        sscanf(lines[i]->c_str(), "vt %f %f %f %f", tempX, tempY, tempZ);

        model->textureVectors.push_back(new Vector3(tempX, tempY, tempZ));
    }
    else if((*lines[i])[0] == 'f')
    {
        U16 counter = std::count(lines[i]->begin(), lines[i]->end(), '/');

        if(counter == 0)
        {
            S32 v1, v2, v3;
            sscanf(lines[i]->c_str(), "f %d %d %d", v1, v2, v3);

            model->faces.push_back(new Face(v1, v2, v3));
        }
        else if(counter == 3)
        {
            S32 v1, v2, v3;
            S32 vt1, vt2, vt3;
            sscanf(lines[i]->c_str(), "f %d/%d %d/%d %d/%d", v1, vt1, v2, vt2, v3, vt3);

            model->faces.push_back(new Face(v1, v2, v3, vt1, vt2, vt3));
        }
        else if(counter == 6)
        {

            /* Just testing if find works fine */
            const std::string &main = "hello world";
            const std::string &part = "world";

            if(main.find(part) != std::string::npos)
            {
                S32 v1, v2, v3;
                S32 vn;
                sscanf(lines[i]->c_str(), "f %d//%d %d//%d %d//%d", v1, vn, v2, vn, v3, vn);

                model->faces.push_back(new Face(v1, v2, v3, vn));
            }
            else
            {
                S32 v1, v2, v3;
                S32 vn;
                S32 vt1, vt2, vt3;
                sscanf(lines[i]->c_str(), "f %d/%d/%d %d/%d/%d %d/%d/%d", v1, vt1, vn, v2, vt2, vn, v3, vt3, vn);

                model->faces.push_back(new Face(v1, v2, v3, vt1, vt2, vt3, vn));
            }
        }
    }
}

    return model;
}

当我用if(main.find ...)删除所有程序时,我的程序正常工作。

1 个答案:

答案 0 :(得分:1)

问题在于sscanf行:

S32 v1, v2, v3;
S32 vn;
sscanf(lines[i]->c_str(), "f %d//%d %d//%d %d//%d", v1, vn, v2, vn, v3, vn);

sscanf希望获得地址来存储它从字符串中解析的值。这些调用在这里将未初始化的值v1,vn等作为地址传递,导致sscanf将结果写入内存中的随机位置。

这可以让你更接近目标:

sscanf(lines[i]->c_str(), "f %d//%d %d//%d %d//%d", &v1, &vn, &v2, &vn, &v3, &vn);

(我注意到'&amp; vn'在这里多次传递,这可能不是预期的)