我正在创建一个函数,它接受一个字符串作为数据看起来像:“D。Smith,87,65,98,87,92”,然后用逗号分析字符串并分配变量的值:string name,int score1,int score2,int score3,int score4和int score5。请注意,解析字符串时,字符串的第一部分(D. Smith)应保存为字符串,而以下部分(87,65,98,87,92)应保存为整数。将字符串作为输入后,输出应如下所示:
Name: D. Smith
Score One: 87
Score Two: 65
Score Three: 98
Score Four 87
Score Five: 92
我知道这可以通过向量来完成,但我的目标是找到一种不用的方法。现在,这是我的代码:
Quarterback::Quarterback(string data) {
string Name;
int j = 0;
for (int i = 0; i < data.length(); i++) {
if (data[i] == ',')
j++;
while (j < 1){
Name = Name + data[i];
}
.....
}
我是否按照这种想法走上了正确的轨道?任何建议将不胜感激!
答案 0 :(得分:0)
在给你一个解决方案之前,我会给你一些提示,以便你能多思考一下。想想你需要拆分字符串的所有部分。是,
,对吗?所以,只需像你一样检查逗号,如果找到它,你要么找到了字符串,要么找到了一些整数。在另一种情况下,只需将该字符添加到某个临时字符串中,该字符串将是您要解析的当前部分。
答案 1 :(得分:0)
首先,(因为您使用的是标准库),您应该真正使用迭代器。使用它们,你可以“标记”字符串中的任何位置(并获得它的char值),因此没有内存浪费在临时字符串上,你可以随意拥有它们(名称的开头,名称的结尾,开始)数字,数字结尾,字符串结尾等。它们当然支持算术(加/减,递增/递减,比较等)。并且一对迭代器可以很容易地转换为字符串。
其次,您应该使用尽可能多的内置函数(例如std::find(...)
来查找逗号,迭代器对字符串转换等)以尽量减少可能的错误。
最后(但并非最不重要):将复杂任务划分为一系列简单的子任务(使用C ++,它们的性能成本为零)。在你的情况下,它将是:找到下一个逗号,解析数字。因此,您的代码应类似于:
Quarterback::Quarterback(string data) {
auto stringStart = data.cbegin();
auto stringEnd = data.cend();
auto nameStart = stringStart;
auto nameEnd = findNextComma(nameStart, stringEnd);
std::string name(nameStart, nameEnd); // easy as that :)
auto numberStart = nameEnd;
while (numberStart < stringEnd) {
auto numberEnd = findNextComma(numberStart + 2, stringEnd); // skip previous comma and space
int number = parseNumber(numberStart, numberEnd); // do whatever you need to do with an int
numberStart = numberEnd;
}
}
template <typename I> I findNextComma(I start, I end) {
...
}
template <typename I> int parseNumber(I start, I end) {
...
}