【问题标题】:string::std find method always find a character, even when it's not in the stringstring::std find 方法总是找到一个字符,即使它不在字符串中
【发布时间】:2015-05-15 03:53:16
【问题描述】:

我正在为学校做一个项目,我们正在解析从文本文件传入的字符串。但是,我遇到了 string.find 的问题。当我运行这段代码时:

string theFile;
while (inFile)
{
    inFile.getline(line, 512);
    theFile = line;
    bool parsing = true;
    while (parsing){
        Choice *newChoice = new Choice;
        if (theFile.find("|")!= -1) {
            newChoice->lines = theFile.substr(theFile.find("%") + 1, theFile.find("|") - 1); 
            theFile.erase(0, theFile.find("|") + 2); 
            tempNPC->choices.push_back(newChoice); 
        }
        else
           parsing = false;

输入看起来像这样:

| d1% stuff | d2% more stuff |

我的问题:if 语句永远不会是假的。即使 theFile 为空,它仍会运行代码,因此出现越界错误。知道为什么 find("|") 不起作用吗?

*编辑添加我如何从文件中获取字符串

【问题讨论】:

  • theFile是什么类型?
  • 只是一个.txt文件
  • .txt 不是类型。您需要在代码中显示theFile 的声明,而不是假设每个人都知道您使用的类型。
  • 哦,我误解了你在问什么。它是一个字符串。 string theFile; while (inFile) { inFile.getline(line, 512); theFile = line;
  • 你的内循环也很可怕,应该是while( theFile.find('|') != string::npos )。正如您所拥有的那样,它既不必要地冗长,又会在最后一次迭代中泄漏内存。

标签: c++ string pointers visual-c++ string-parsing


【解决方案1】:

您可能想查看一些documentation,以便了解std::string::find 的返回值的实际含义。具体来说,如果您不确定某个值是否存在,您应该在使用它之前将其与npos 进行比较,而不是“-1”。在您的输入用尽后它继续运行的问题可能最好在您未显示的输入代码中解决,而不是尝试解析一些可能是也可能不是实际输入的string

更新:正如我在下面对 vsoftco 的评论中推测的那样,您的输入逻辑已损坏。使用这个:

while (getline(inFile, theFile))
    ...

【讨论】:

  • 虽然std::string::npos被定义为size_type(-1),可能和-1比较应该没问题(虽然我不知道它的便携性如何)。
  • @vsoftco:它很草率......并且只进行了一次比较......我怀疑擦除正在改变一个有效的行,然后重新解析它,因为没有正确检测到 EOF,例如other finds(在if 之后)得到npos - 他们根本没有检查它。只是马虎。
  • @TonyD 所以你是建议我把theFile.erase改成别的吗?
  • @itsmountainman:我建议您检查文件读取逻辑,以便它在 EOF 处干净地退出,并且不会调用解析该行的代码,然后还要修改上面的内容,以便正确处理输入不符合预期:即不要假设所有其他 finds(在 if 之后)实际上会找到您正在搜索的字符。
  • @itsmountainman:现在您已经在评论中显示了相关代码:while (inFile) { inFile.getline(line, 512); theFile = line; 已损坏,因为在 getline 之前检查了 while 条件,这可能会设置错误/失败/eof状态:在getline 之后,如果您使用line 而不首先再次检查inFile,则不能保证从文件中获得下一行,正如我在上面对vsoftco 的评论中推测的那样,您最终会尝试重新处理上一行中的部分-erased string,使得某些finds“失败”(但不是控制if语句的那个​​)。
猜你喜欢
  • 2017-01-26
  • 2016-10-04
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多