下面是一段解析十六进制字符串的代码,可以分析看看有没有什么问题。
int main(){
string a = "6a 4e";
int i = 0;
for (; i < a.size(); i += 2;){
cout << "start:" << i << endl;
if (a[i] == ' '){
++i;
continue;
}
string sub = a.substr(i, 2);
char hex = stoi(sub, nullptr, 16);
cout << hex << endl;
}
cout << "end:" << i << endl;
return 0;
}
这段代码执行完毕后的打印是这样的:
start:0
j
start:2
end:5
以上代码出现了问题,只解析到第一个十六进制数,然后直接跳出了循环。直观分析,当i==2时i自增1后等于3,此时进入下一次循环应该仍然小于a.size(),但代码执行结果告诉我们这时的i已经等于5了。其实该次循环先后顺序应该是:1. i == 2 进入循环 2.判断字符为空格 ++i (i == 3) 3.i += 2(i == 5) 。continue并不会将本次的increment省略。所以本段代码应该这样修改:
int main(){
string a = "6a 4e";
int i = 0;
for (; i < a.size();){
cout << "start:" << i << endl;
if (a[i] == ' '){
++i;
continue;
}
string sub = a.substr(i, 2);
char hex = stoi(sub, nullptr, 16);
cout << hex << endl;
}
i += 2;
cout << "end:" << i << endl;
return 0;
}