Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于在C+中使用分隔符高效解析多个数字的函数+;_C++_String_Error Handling_Delimiter - Fatal编程技术网

C++ 用于在C+中使用分隔符高效解析多个数字的函数+;

C++ 用于在C+中使用分隔符高效解析多个数字的函数+;,c++,string,error-handling,delimiter,C++,String,Error Handling,Delimiter,下面的函数只接受一个用64位整数填充的字符串,每个值由一个分隔符分隔,分隔符将放入向量中 vector<unsigned long long int> getAllNumbersInString(string line, char delim){ vector<unsigned long long int> v; string word; stringstream stream(line); unsigned long long int

下面的函数只接受一个用64位整数填充的字符串,每个值由一个分隔符分隔,分隔符将放入向量中

vector<unsigned long long int> getAllNumbersInString(string line, char delim){
    vector<unsigned long long int> v;

    string word;
    stringstream stream(line);
    unsigned long long int num;

    while(getline(stream, word, delim))
        num = atol(word.c_str());
        v.push_back(num);
    }

    return v;
}
虽然数据似乎使用空格作为分隔符,但使用上面的代码,整个代码在逻辑上都会失败。例如,空白之间的空白未定义,atol将返回0,并将这些零放入向量中

vector<unsigned long long int> getAllNumbersInString(string line, char delim){
    vector<unsigned long long int> v;

    string word;
    stringstream stream(line);
    unsigned long long int num;

    while(getline(stream, word, delim))
        num = atol(word.c_str());
        v.push_back(num);
    }

    return v;
}

为了更好地防止这些异常,我应该在代码中采取哪些措施?

您可以让iostreams库为您处理空白:

unsigned long long int num;
while(stream >> num)
    v.push_back(num);

您可以让iostreams库为您处理空白:

unsigned long long int num;
while(stream >> num)
    v.push_back(num);

你有什么理由不能/不使用这样的东西吗

while (stream >> num)
   v.push_back(num);
或者只是:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line);  
    typedef unsigned long long int T;

    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>());
    return v;
}
向量GetAllNumberInstalling(字符串行){ istringstream(线); typedef无符号长整型T; 向量v((istream_迭代器(stream)),istream_迭代器(); 返回v; }
如果必须处理除空格以外的分隔符,则可以创建一个ctype方面,以指定其他应被视为分隔符的内容。

有什么原因不能/不会仅使用这样的内容吗?:

while (stream >> num)
   v.push_back(num);
或者只是:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line);  
    typedef unsigned long long int T;

    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>());
    return v;
}
向量GetAllNumberInstalling(字符串行){ istringstream(线); typedef无符号长整型T; 向量v((istream_迭代器(stream)),istream_迭代器(); 返回v; }
如果您必须处理除空格以外的分隔符,您可以创建一个ctype方面来指定其他应被视为分隔符的内容。

也许
stream>>num
就足够了?也许
stream>>num
就够了?我明白了。所以我们也可以这样做。听起来我现在需要彻底复习C++。我学高级语言太久了…我明白了。所以我们也可以这样做。听起来我现在需要彻底复习C++。我学高级语言太久了。。。