在C++中对字符串进行分词

6
我有一个字符串currentLine="12 23 45",需要从中提取出12、23、45,但不使用Boost库。由于我使用的是字符串,所以strtok对我来说无法使用。我尝试了很多方法,但仍然没有成功。
下面是我的最后一次尝试:
while(!inputFile.eof())
    while(getline(inputFile,currentLine))
        {
            int countVar=0;
            int inputArray[10];
            char* tokStr;
            tokStr=(char*)strtok(currentLine.c_str()," ");

            while(tokstr!=NULL)
            {
            inputArray[countVar]=(int)tokstr;
            countVar++;
            tokstr=strtok(NULL," ");
            }
        }
}

没有使用strtok的方法
string currentLine;
while(!inputFile.eof())
    while(getline(inputFile,currentLine))
        {
            cout<<atoi(currentLine.c_str())<<" "<<endl;
            int b=0,c=0;
            for(int i=1;i<currentLine.length();i++)
                {
                    bool lockOpen=false;
                    if((currentLine[i]==' ') && (lockOpen==false))
                        {
                        b=i;
                        lockOpen=true;
                        continue;
                        }
                    if((currentLine[i]==' ') && (lockOpen==true))
                        {
                        c=i;
                        break;
                        }
                }
            cout<<b<<"b is"<<" "<<c;    
        }

这是你真正的代码吗,tokstrtokStr大小写不匹配?另外,https://dev59.com/k3VC5IYBdhLWcg3wnCj6。 - Mr Lister
您没有报告它们是如何失败的。它们是否编译通过?它们是否崩溃?它们是否给出了错误的结果? - David Schwartz
使用 >> 运算符和一个整数参数。 - Shiplu Mokaddim
抱歉打错字了,撤销操作时必须复制tokstr。 - CodeMonkey
4个回答

9

试试这个:

#include <sstream>

std::string str = "12 34 56";
int a,b,c;

std::istringstream stream(str);
stream >> a >> b >> c;

在这里阅读有关C++流的大量信息:http://www.cplusplus.com/reference/iostream/


错误:变量'std :: istringstream stream'具有初始化程序但类型不完整。 - CodeMonkey
@user1290495,#include <sstream> - hmjd

5
std::istringstream istr(your_string);

std::vector<int> numbers;
int number;
while (istr >> number)
    numbers.push_back(number);

或者,更简单的方法(虽然并不真正更短):
std::vector<int> numbers;
std::copy(
    std::istream_iterator<int>(istr),
    std::istream_iterator<int>(),
    std::back_inserter(numbers));

(需要标准头文件,和。)

0

您还可以选择Boost分词器......

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;

int main(int argc, char** argv)
{
    string str= "India, gold   was dear";
    char_separator<char> sep(", ");
    tokenizer< char_separator<char> > tokens(str, sep);
    BOOST_FOREACH(string t, tokens)
    {
        cout << t << "." << endl;
    }
}

1
不使用Boost库 - k06a

0

stringstreamboost::tokenizer 是两种可能的解决方案。这里提供了一种更明确的解决方案,使用了 string::findstring::substr

std::list<std::string>
tokenize(
  std::string const& str,
  char const token[])
{
  std::list<std::string> results;
  std::string::size_type j = 0;
  while (j < str.length())
  {
    std::string::size_type k = str.find(token, j);
    if (k == std::string::npos)
      k = str.length();

    results.push_back(str.substr(j, k-j));
    j = k + 1;
  }
  return results;
}

希望这可以帮到你。你可以很容易地将其转换为一个算法,将令牌写入任意容器或使用处理令牌的函数句柄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接