无法使用substr和find正确解析带有空格的字符串

Cant parse string with whitespace correctly using substr and find

本文关键字:空格 字符串 substr find      更新时间:2023-10-16

当我向正在读取的csv文件添加空白时,例如,将"ProgrammingInterviews"更改为"ProgrammingExperts",我的程序将崩溃,并出现以下错误:

terminate called after throwing an instance of 'std::invalid_argument'  
what():  stoi    
Aborted (core dumped)

stoi()正在抱怨,因为它正被馈送一个字符串。在填充后直接打印出字符串数组的每个元素,这表明函数忽略了分隔符并停止读取空白字符,然后用相同的字符串填充字符串数组的各个元素。

据我所知,这不是substr()find()的预期行为。

fstream finb ("books.csv", ios::in);
// Buffer
char arr[100];
string s;
string delimiter = ",";
while(fins>>arr){
s=arr;
int i;
string data[3];
for(i=0; i<3; i++){
data[i] = s.substr(0, s.find(delimiter));
cout << "data[" << i << "]: " << data[i] << endl;
s.erase(0, s.find(delimiter) + delimiter.length());
}
students.push_back({stoi(data[0]), data[1], data[2], stoi(s)});
}

带有空格的csv示例(不起作用(:

111941847,Programming Interviews,NoahSuojanenKindler,0

没有空白的csv示例(工作(:

111941847,ProgrammingInterviews,NoahSuojanenKindler,0

csv中带空格的字符串数组示例:

data[0]: 111941847
data[1]: Programming
data[2]: Programming
s: Programming

csv中没有空格的字符串数组示例:

data[0]: 111941847
data[1]: ProgrammingInterviews
data[2]: NoahSuojanenKindler
s: 0

使用getline()而不是operator>>进行修复。

for (string line; getline(finb, line);) {
int isbn = stoi(line.substr(0, line.find(delimiter)));
line.erase(0, line.find(delimiter) + delimiter.length());
string bookName = line.substr(0, line.find(delimiter));
line.erase(0, line.find(delimiter) + delimiter.length());
string bookAuthor = line.substr(0, line.find(delimiter));
line.erase(0, line.find(delimiter) + delimiter.length());
int borrowed = stoi(line);
books.push_back({isbn, bookName, bookAuthor, borrowed});
i++;
}