C ++解析,从字符串中获取可变数量的整数

时间:2011-12-14 09:43:47

标签: c++ string parsing

我有一组看起来像的字符串 “4 7 14 0 2 blablabla”
“3 8 1 40 blablablablabla”
...

第一个数字N对应于将跟随多少个数字 基本上,字符串的格式是N + 1个数字,用空格分隔,后面跟着我不需要的未知数量的无关字符。

如果我事先不知道数字N,我如何得到变量或动态结构中的所有数字?

换句话说,我想要像:

sscanf(s, "%d %d %d %d",&n,&x,&y,&z);

无论字符串中有多少个数字都可以使用。

6 个答案:

答案 0 :(得分:6)

首先,通过使用将输入分解为行 getline阅读它。这将极大地促进错误恢复和 发生错误时重新同步。它还有助于解析; 这是几乎每次换行都应该采用的策略 输入很重要。之后,您使用std::istringstream来 解析这条线。类似的东西:

std::vector<std::vector<int> > data;
std::string line;
while ( std::getline( input, line ) ) {
    std::istringstream l( line );
    int iCount;
    l >> iCount;
    if ( !l || iCount < 0 ) {
        //  format error: line doesn't start with an int.
    } else {
        std::vector<int> lineData;
        int value;
        while ( lineData.size() != iCount && l >> value ) {
            lineData.push_back( value ) ;
        }
        if ( lineData.size() == iCount ) {
            data.push_back( lineData );
        } else {
            //  format error: line didn't contain the correct
            //  number of ints
        }
    }
}

答案 1 :(得分:4)

int input;
std::vector<int> ints;
while(std::cin >>  input)  //read as long as there is integer
       ints.push_back(input);
std::cin.clear(); //clear the error flag
//read the remaining input which most certainly is non-integer

答案 2 :(得分:2)

std::string s = "3 54 -4 42 fdsvadsdsberwte";
std::istringstream source(s);

std::vector<int> ints;

int num = 0;
int temp = 0;

if (source >> num)  // read the first number and if it succeeds, read the rest
{
    while(source >> temp) ints.push_back(temp);
    // Here, I'd compare the size of the vector with what was
    // expected (num) and act accordingly.
}
else
{
     // format error 
} 

答案 3 :(得分:0)

使用您的字符串初始化istringstream,并从中读取:

std::istringstream ss(s);

int N;
ss >> N;

std::vector<int> a(N); //int* a = new int[N];
for (int i=0;i<N;i++)
    ss >> a[i];

答案 4 :(得分:0)

你可以这样做:

std::string buffer;
while(std::getline(in, buffer)) {    // read a line
    std::istringstream str(buffer);  // put line in a stringstream for parsing
    int count;
    str >> count;                    // read first number
    std::vector<int> numbers(count); // reserve space for other numbers
    for(int i = 0; i < count; i++) { // read other numbers
        str >> numbers[i];
    }
}    

答案 5 :(得分:0)

您可以使用动态数组和动态数组类型的链表。读取一行后,使用数字N初始化数组,并在每个索引上按顺序插入数字。将包含行数据的节点插入链接列表。

伪代码:

int *lineNumbers;
lineNumbers = new int[N];

List<int*> data;
data.insert(lineNumbers);