您的位置:

cstring转int详解

一、从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;
}