string转int类型:坑货stoi的替代者strtol

string maxFrameRate = to_string(stoi(maxFrameRate)*100);
//上述代码在转换时如果maxFrameRate为“dad66”这样的字符串而不是纯数字字符串,
//那么就会导致程序直接挂掉,并无异常处理机制

//正品:long int strtol(const char *nptr, char **endptr, int base)
string maxFrameRate = to_string(strtol(maxFrameRate.c_str(), NULL, 10)*100);
//这样就不会直接崩掉了,“dad66”这样的字符串会被直接转化为0,“66dad”这样的字符串会被转化为66

strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给*endptr。**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。多数情况下,endptr设置为NULL, 即不返回非法字符串。下述三个例子引自https://blog.csdn.net/zxx2096/article/details/81127858

char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 2));
printf("%s\n", stop);
输出结果:
2
379cend$3
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 10));
printf("%s\n", stop);
输出结果:
10379
cend$3

对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。

char buffer_1[20]="10379c";
char buffer_2[20]="      10379c        ";
char buffer_3[20]="      10      379c        ";
printf("%d\n",strtol(buffer_1,NULL,0));
printf("%d\n",strtol(buffer_2,NULL,0));
printf("%d\n",strtol(buffer_3,NULL,0));
输出结果为:
10379
10379
10

 

发布了40 篇原创文章 · 获赞 16 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章