两个将字符串转为int的方法
atoi(C语言)
atoi
是 C 库中的一个函数,它定义在 <cstdlib>
头文件里。其作用是把一个字符串转换为对应的整数。
/* Convert a string to an integer. */
extern int atoi (const char *__nptr)
__THROW __attribute_pure__ __nonnull ((1)) __wur;
转换的原则如下:
此函数接收一个以空字符 '\0'
结尾的字符串 str
作为参数,然后尝试把该字符串转换为一个 int
类型的整数。
- 该函数会跳过字符串开头的空白字符(像空格、制表符、换行符等)。
- 接着,它会识别一个可选的正负号(+ 或者 -)。
- 随后,它会尽可能多地读取数字字符,直到遇到非数字字符或者字符串结束符 ‘\0’。
- 最后,它会把读取到的数字字符转换为整数并返回。要是字符串里没有有效的数字,或者字符串仅包含空白字符,函数会返回 0。
下面是示例代码:
const char* str1 = "123";
const char* str2 = " -456";
const char* str3 = "abc123";
const char* str4 = " 789abc";
int num1 = atoi(str1);
int num2 = atoi(str2);
int num3 = atoi(str3);
int num4 = atoi(str4);
std::cout << "str1 转换结果: " << num1 << std::endl;
std::cout << "str2 转换结果: " << num2 << std::endl;
std::cout << "str3 转换结果: " << num3 << std::endl;
std::cout << "str4 转换结果: " << num4 << std::endl;
转换结果如下:
str1 转换结果: 123
str2 转换结果: -456
str3 转换结果: 0
str4 转换结果: 789
对于 str1,它是一个纯粹的数字字符串 “123”,所以 atoi 会把它转换为整数 123。
对于 str2,字符串开头有空白字符,随后是负号和数字,atoi 会忽略空白字符,识别负号,然后把数字转换为 -456。
对于 str3,字符串开头没有数字,所以 atoi 会返回 0。
对于 str4,字符串开头有空白字符,接着是数字,atoi 会忽略空白字符,把数字 789 转换为整数并返回。
atoi
的设计有很浓的C语言设计风格,你甚至不知道返回0是因为失败了还是因为原来的字符串本身就是0.
std::stoi
std::stoi
是 C++ 标准库 <string>
中的函数。除了名字不同以外,两个函数有以下不同点:
atoi | std::stoi | |
---|---|---|
位置 | <stdlib.h> 或<cstdlib> |
<string> |
函数原型 | extern int atoi (const char *__nptr) | inline int stoi(const string& __str, size_t* __idx = 0, int __base = 10) |
失败 | 返回0 | 抛出异常 |
依然是上面的例子:
const std::string str1 = "123";
const std::string str2 = " -456";
const std::string str3 = "abc123";
const std::string str4 = " 789abc";
try
{
int n1 = std::stoi(str1);
std::cout << "new str1 转换结果: " << n1 << std::endl;
}
catch (std::exception &e)
{
std::cout << "new str1 转换结果: " << e.what() << std::endl;
}
try
{
int n1 = std::stoi(str2);
std::cout << "new str2 转换结果: " << n1 << std::endl;
}
catch (std::exception &e)
{
std::cout << "new str2 转换结果: " << e.what() << std::endl;
}
try
{
int n1 = std::stoi(str3);
std::cout << "new str3 转换结果: " << n1 << std::endl;
}
catch (std::exception &e)
{
std::cout << "new str3 转换结果: " << e.what() << std::endl;
}
try
{
int n1 = std::stoi(str4);
std::cout << "new str4 转换结果: " << n1 << std::endl;
}
catch (std::exception &e)
{
std::cout << "new str4 转换结果: " << e.what() << std::endl;
}
第三个因为开头是非数字字符,转换失败抛异常:
new str1 转换结果: 123
new str2 转换结果: -456
new str3 转换结果: stoi
new str4 转换结果: 789
__idx
参数的设计也很有C语言的风格,它存储了第一个未被转换的字符的位置。
try
{
size_t end;
int n1 = std::stoi(str4, &end);
std::cout << "new str4 转换结果: " << n1 << " End pos: " << end << std::endl;
}
catch (std::exception &e)
{
std::cout << "new str4 转换结果: " << e.what() << std::endl;
}
第五个字符就不是数字了,就停在这里。
new str4 转换结果: 789 End pos: 5