我有一组看起来像的字符串
“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);
无论字符串中有多少个数字都可以使用。
答案 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);