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
希望这将对您有所帮助。这将把字符串更改为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
希望这能对您有所帮助。这符合我的目的,我可以提取整数,必要时还可以添加分隔符。也适用于不同格式的字符串。
(我没有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这符合我的目的,在这里,我可以提取整数,必要时还可以添加分隔符。也适用于不同格式的字符串。
(我没有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的情况下提供解决方案