【问题标题】:Removing section between parenthesis on every line if present如果存在,则删除每行括号之间的部分
【发布时间】:2016-09-11 13:45:39
【问题描述】:

我有一个我正在输入的文件,其中包含一堆看起来像 (* blah blah 4324 blah*) 的行 23. 我要做的是删除括号之间的所有内容并保留紧随其后的数字右括号。

ifstream infile{"nums.txt"};
istream_iterator<string> infile_begin_iter {infile};
istream_iterator<string> eof;
vector<string> cleanNums {infile_begin_iter, eof};

for(int i=0; i<cleanNums.size(); i++){
    int openParen=cleanNums[i].find("(*");
    int closeParen=cleanNums[i].find("*)");
    int distance=openParen-closeParen;
    cleanNums[i].erase(closeParen, distance);
}

该代码不断导致我的程序崩溃,并且可能让您感到畏缩。我一直在这里寻找不同的东西,比如 getline ,但我发现它只显示了分隔符之前的所有内容。提前致谢。

【问题讨论】:

  • 它是如何导致你的程序崩溃的?您收到错误消息吗? cleanNums 是如何定义的?我们需要更多信息来帮助您解决问题。
  • 使用调试器解决您的崩溃问题。 :) 并发布最小、完整和可验证的示例stackoverflow.com/help/mcve
  • 如果有一行没有括号怎么办?你认为find 会返回什么?当您使用这些值调用 erase 时,您认为会发生什么?
  • 通常,erase() 的第二个参数不是要擦除的最后一个索引/迭代器,而是要擦除多少元素的 count .

标签: c++ find stdstring erase


【解决方案1】:

由于没有给出声明,我假设cleanNumsstd::vector&lt;std::string&gt;

现在到问题中的代码 sn-p:std::string::find() 为找到给定字符串的位置返回一个size_type(即通常是一些整数类型)。所以openParencloseParen 将是找到左括号和右括号的索引——如果它们被找到的话。 std::string::erase(),当使用 size_type 类型的参数调用时,会将这些参数解释为应擦除部分的起始索引和长度。但是,您将其称为应删除部分的起始索引和最后一个索引。所以你要做的是使用这两个索引来计算在传递给erase()之前应该删除的部分的长度。

还有另一个问题,可能是导致程序崩溃的问题:您没有检查两个std::string::find() 调用是否确实找到了一些东西。因为如果不这样做,那么它们会返回std::string::npos,这通常大于大多数字符串的大小。这会导致索引超出范围,并且std::string::erase() 会引发std::out_of_range 异常。砰,程序崩溃!

那么,这里的教训是什么? 如果您不确定,请不要假设函数/方法需要什么样的参数,而是在您最喜欢的 C++ 参考资料中查找。如果编译器不阅读它使用/编译的函数的文档是可以的,但程序员应该至少阅读一次他/她使用的函数的文档。

【讨论】:

    【解决方案2】:

    您可以使用std::getline 读取结束的')' 字符,然后您知道下一次读取将是您的号码:

    int main()
    {
        std::ifstream ifs("test.txt");
    
        std::string skip; // read in parts you want to skip
        int value;        // the value you want to keep
    
        // skip data upto and past ')', then read number
        while(std::getline(ifs, skip, ')') >> value)
            std::cout << "found: " << value << '\n'; // output just the number
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多