一、从stringstream转换到cstring
在c++中,我们可以使用stringstream类型将数字转换为字符串,例如:
string str_num = "123"; int num; stringstream ss(str_num); ss >> num;
但在实际使用中,我们可能需要将一个char数组或cstring类型的字符串转换为int类型,我们可以采用类似的方法:
char cstr_num[] = "456"; int num; stringstream ss(cstr_num); ss >> num;
使用stringstream的好处是可以避免一些常见的错误,例如对于无法转换的字符串,它可以返回0而不是随机值,也不会退出程序,而且它可以自动忽略字符串中的非数字字符。
二、从sscanf转换到cstring
sscanf是c语言中一个十分常见的函数,它可以将一个字符串解析成指定格式的不同类型的数据,例如:
char cstr_num[] = "789"; int num; sscanf(cstr_num, "%d", &num);
其中,"%d"是指定的格式控制字符。但是,当给定的字符串中出现非数字字符时,sscanf会将该字符作为一个数字处理,并导致程序错误。
为了避免这种情况,我们可以使用sscanf的一个非常有用的特性,即它返回成功读取的数字的数量。
char cstr_num[] = "123abc"; int num; int count = sscanf(cstr_num, "%d", &num); if (count > 0) { // 转换成功 } else { // 转换失败 }
三、使用strtod、strtol、strtoul、strtoll、strtoull等函数转换
在c库中,还有一些函数可以用来将字符串转换为数字类型,它们的具体使用方法如下:
- strtod:将字符串转换为double类型。
- strtol:将字符串转换为long int类型。
- strtoul:将字符串转换为unsigned long int类型。
- strtoll:将字符串转换为long long int类型。
- strtoull:将字符串转换为unsigned long long int类型。
这些函数可以传入一个指向字符串的指针和指向一个指针的指针,后者用来指示输出结果的开始位置。在这几个函数中,strtod最为灵活,可以处理有小数点或指数的字符串。而其余函数的用法都比较类似,以strtol为例:
char cstr_num[] = "987"; char* endptr; long int num = strtol(cstr_num, &endptr, 10); if (cstr_num == endptr) { // 转换失败 } else { // 转换成功 }
其中参数10是指数字的进制,可以是2到36之间的任意值。如果设为0,strtoul就会根据字符串的前缀来判断进制,如0x表示16进制,0表示8进制,其他则为10进制。
四、使用atoi、atol、atoll等函数转换
这些函数使用起来非常简单,直接传入需要转换的字符串即可,例如:
char cstr_num[] = "999"; int num = atoi(cstr_num);
但是这些函数非常的不安全,如果处理非数字字符,就会导致未定义的行为,因此在正式的代码中应该避免使用它们。
五、完整代码示例
以下代码是一个完整的cstring转int的示例:
#include <iostream> #include <sstream> using namespace std; int cstr_to_int(string str_num) { int num; stringstream ss(str_num); ss >> num; return num; } int cstr_to_int(char* cstr_num) { int num; stringstream ss(cstr_num); ss >> num; return num; } int main() { string str_num = "123"; char cstr_num[] = "456"; cout << "string to int: " << cstr_to_int(str_num) << endl; cout << "char array to int: " << cstr_to_int(cstr_num) << endl; return 0; }