Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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_Stringstream - Fatal编程技术网

C++ C++;提取具有多个分隔符的字符串中的整数

C++ C++;提取具有多个分隔符的字符串中的整数,c++,string,stringstream,C++,String,Stringstream,我试图从字符串中提取整数。这里可能出了什么问题? 我只得到第一个值。即使字符串中有零,我如何使它工作 string str="91,43,3,23,0;6,9,0-4,29,24"; std::stringstream ss(str); int x; while(ss >> x) { cout<<"GOT->"<<x<<endl; char c; ss >> c; //Discard a non space

我试图从字符串中提取整数。这里可能出了什么问题? 我只得到第一个值。即使字符串中有零,我如何使它工作

string str="91,43,3,23,0;6,9,0-4,29,24";
std::stringstream ss(str);
int x;
while(ss >> x)
{
    cout<<"GOT->"<<x<<endl;
    char c;
    ss >> c; //Discard a non space char.
    if(c != ',' || c != '-' || c != ';')
    {
        ss.unget();
    }
}
string str=“91,43,3,23,0;6,9,0-4,29,24”;
std::stringstream ss(str);
int x;
while(ss>>x)
{

请仔细观察这条线:

if(c != ',' || c != '-' || c != ';')
请注意,此条件始终为真,因此您总是
取消设置
标点符号。下一次读取将始终失败,因为它在需要数字时读取标点符号。将
|
更改为
&
,应该可以解决此问题


当然,您的代码假定
str
是以一种非常特殊的方式格式化的,并且当给定一个格式不同的
str
值时,它可能会中断。请注意这一点。

仔细看这一行:

if(c != ',' || c != '-' || c != ';')
请注意,此条件始终为真,因此您总是
取消设置
标点符号。下一次读取将始终失败,因为它在需要数字时读取标点符号。将
|
更改为
&
,应该可以解决此问题


当然,您的代码假定
str
是以一种非常特殊的方式格式化的,并且当给定一个格式不同的
str
值时,可能会中断。请注意这一点。

u可以通过boost split来完成此操作

   int main() {
      std::stringstream ss;
      std::string inputString = "91,43,3,23,0;6,9,0-4,29,24";
      std::string delimiters("|,:-;");
      std::vector<std::string> parts;
      boost::split(parts, inputString, boost::is_any_of(delimiters));
      for(int i = 0; i<parts.size();i++ ) {
           std::cout <<parts[i] << " ";
      }
   return 0;
   }
intmain(){
std::stringstream-ss;
std::string inputString=“91,43,3,23,0;6,9,0-4,29,24”;
std::字符串分隔符(“|,:-”);
向量部分;
boost::split(parts、inputString、boost::是(分隔符)的任意一个);

对于(inti=0;iu)来说,可以通过boostsplit来实现这一点

   int main() {
      std::stringstream ss;
      std::string inputString = "91,43,3,23,0;6,9,0-4,29,24";
      std::string delimiters("|,:-;");
      std::vector<std::string> parts;
      boost::split(parts, inputString, boost::is_any_of(delimiters));
      for(int i = 0; i<parts.size();i++ ) {
           std::cout <<parts[i] << " ";
      }
   return 0;
   }
intmain(){
std::stringstream-ss;
std::string inputString=“91,43,3,23,0;6,9,0-4,29,24”;
std::字符串分隔符(“|,:-”);
向量部分;
boost::split(parts、inputString、boost::是(分隔符)的任意一个);

对于(int i=0;i这将把字符串更改为char并注销:-

#include <iostream>
#include <string>
using namespace std;
int main(){ 
    string str = "91,43,3,23,0;6,9,0-4,29,24";
    str.c_str();  // ex: string a; --> char a[];
    char a[99];
    int j = 0;
    int x;
    for(int i = 0; i < str.length(); i++){
        if (str[i]!=',' && str[i]!=';' && str[i]!='-'){
            a[j] = str[i];
            j++;
        }
    }
    return 0;
}
#包括
#包括
使用名称空间std;
int main(){
字符串str=“91,43,3,23,0;6,9,0-4,29,24”;
str.c_str();//ex:string a;-->char a[];
chara[99];
int j=0;
int x;
对于(int i=0;i
#包括
#包括
使用名称空间std;
int main(){
字符串str=“91,43,3,23,0;6,9,0-4,29,24”;
str.c_str();//ex:string a;-->char a[];
chara[99];
int j=0;
int x;
对于(int i=0;i>x;

cout这符合我的目的,在这里,我可以提取整数,必要时还可以添加分隔符。也适用于不同格式的字符串。 (我没有boost库,因此更喜欢这种方法。)

intmain()
{
字符串str=“2,3,4;0,1,3-4289,24,21,45;2”;
//字符串str=“;2;0,1,3-4289,24;21,45;2”;//输入2
std::stringstream ss(str);
int x=0;
如果(str.length()!=0)
{
而(!ss.eof())
{
if(ss.peek()!=','&&ss.peek()!=';'&&ss.peek()!='-')/*分隔符*/
{
ss>>x;
cout您也可以尝试:

vector<int> SplitNumbersFromString(const string& input, const vector<char>& delimiters)
{
    string buff{""};
    vector<int> output;

    for (auto n : input)
    {
        if (none_of(delimiters.begin(), delimiters.end(), [n](const char& c){ return c == n; }))
        {
            buff += n;
        }
        else
        {
            if (buff != "")
            {
                output.push_back(stoi(buff));
                buff = "";
            }
        }
    }
    if (buff != "") output.push_back(stoi(buff));

    return output;
}

vector<char> delimiters = { ',', '-', ';' };
vector<int> numbers = SplitNumbersFromString("91,43,3,23,0;6,9,0-4,29,24", delimiters);
vector SplitNumbersFromString(常量字符串和输入,常量向量和分隔符)
{
字符串buff{”“};
矢量输出;
用于(自动n:输入)
{
if(没有(delimiters.begin(),delimiters.end(),[n](const char&c){return c==n;}))
{
buff+=n;
}
其他的
{
如果(buff!=“”)
{
输出。推回(stoi(buff));
buff=“”;
}
}
}
如果(buff!=“”)输出。向后推(stoi(buff));
返回输出;
}
向量分隔符={',','-',';'};
向量数=SplitNumbersFromString(“91,43,3,23,0;6,9,0-4,29,24”,分隔符);
您也可以尝试:

vector<int> SplitNumbersFromString(const string& input, const vector<char>& delimiters)
{
    string buff{""};
    vector<int> output;

    for (auto n : input)
    {
        if (none_of(delimiters.begin(), delimiters.end(), [n](const char& c){ return c == n; }))
        {
            buff += n;
        }
        else
        {
            if (buff != "")
            {
                output.push_back(stoi(buff));
                buff = "";
            }
        }
    }
    if (buff != "") output.push_back(stoi(buff));

    return output;
}

vector<char> delimiters = { ',', '-', ';' };
vector<int> numbers = SplitNumbersFromString("91,43,3,23,0;6,9,0-4,29,24", delimiters);
vector SplitNumbersFromString(常量字符串和输入,常量向量和分隔符)
{
字符串buff{”“};
矢量输出;
用于(自动n:输入)
{
if(没有(delimiters.begin(),delimiters.end(),[n](const char&c){return c==n;}))
{
buff+=n;
}
其他的
{
如果(buff!=“”)
{
输出。推回(stoi(buff));
buff=“”;
}
}
}
如果(buff!=“”)输出。向后推(stoi(buff));
返回输出;
}
向量分隔符={',','-',';'};
向量数=SplitNumbersFromString(“91,43,3,23,0;6,9,0-4,29,24”,分隔符);

在一个不相关的注释上,也许正则表达式值得研究在一个不相关的注释上,也许正则表达式值得研究在不使用
boost的情况下提供解决方案
在不使用
boost的情况下提供解决方案