【问题标题】:Getting Infinite loop while using string.size()使用 string.size() 时获得无限循环
【发布时间】:2014-05-03 18:16:41
【问题描述】:
#include <iostream>
#include <fstream>
#include <cstring>
#define MAX_CHARS_PER_LINE 512
#define MAX_TOKENS_PER_LINE 20
#define DELIMITER " "
using namespace std;
int main ()
{
    string buf = "PiCalculator(RandGen *randGen, int nPoints) : randGen(randGen), nPoints(nPoints) {";
    string buf1 = buf;

    // parse the line into blank-delimited tokens
    int n = 0;
    string token[MAX_TOKENS_PER_LINE] = {};
    token[0] = strtok(&buf[0], DELIMITER);
    if (token[0].size()) // zero if line is blank
    {
      for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
      {
        token[n] = strtok(0, DELIMITER); // subsequent tokens
        if (token[n].size() == 0) break; // no more tokens
      }
    }
    cout<<endl<<endl;
    // process (print) the tokens
    for (int i = 0; i < n; i++) { // n = #of tokens
       int pos=token[i].find('(');
       if(pos == token[i].size())
            continue;
       else{
        cout<<token[i].substr(0,pos)<<endl;
       }
    }
  return 0;
}

使用这个程序,我想对 '(' 之前的子字符串进行排序,即 PiCalculator。但是,当我运行上述程序时,我得到一个无限循环。无法解决问题。任何人都可以帮助我吗?

【问题讨论】:

  • 它对我来说崩溃了......并且不会进入无限循环。 token[n] = strtok(0, DELIMITER); // subsequent tokens -> 这是一种很好的崩溃方式。我想你的意思是 token[n].c_str() ,对吧?你为什么要在 C++ 程序中使用 strtok?
  • 我建议阅读 How to Debug Small Programs 以更好地了解如何调试。
  • 你知道strtok在找不到更多令牌时返回NULL吗?
  • strtok 是一个邪恶的功能。它修改源并返回 NULL,这可能导致 std::string 构造函数崩溃。一般来说,我不建议将它与 C++ 代码一起使用,它太骇人听闻了。
  • @JoachimPileborg:是的,我知道。

标签: c++ string infinite-loop


【解决方案1】:

如果您只想从字符串中获取以空格分隔的“单词”(或标记或您想要调用的名称),C++ 中有一些功能可以非常简单地为您完成:

string buf = "PiCalculator(RandGen *randGen, int nPoints) : randGen(randGen), nPoints(nPoints) {";

std::istringstream iss(buf);
std::vector<std::string> tokens;

std::copy(std::istream_iterator<std::string>(iss),
          std::istream_iterator<std::string>(),
          std::back_inserter(tokens));

以上代码会将字符串buf中的所有(空格分隔)“标记”复制到向量tokens

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2016-05-30
    • 2020-01-31
    相关资源
    最近更新 更多