将字符串转换为 int 是 C++ 中最常遇到的任务之一。由于 string 和 int 不在同一对象层次结构中,因此我们无法像 double 到 int 或 float 到 int 转换那样执行隐式或显式类型转换。转换主要是为了我们可以转换存储为字符串的数字。
例子:
str=”191″
num=191
C++ 中有 5 种将字符串转换为数字的重要方法,如下所示:
- 使用stoi()函数
- 使用atoi()函数
- 使用字符串流
- 使用sscanf()函数
- 使用 for 循环
- 使用strtol()函数
1. 使用stoi()函数将字符串转换为int
stoi() function in C++ 将字符串作为参数并以整数形式返回其值。这种方法在当前版本的 C++ 中很流行,因为它是在 C++11 中首次引入的。
如果你仔细观察stoi(),你会发现它代表:
简单来说 stoi() 的细分
用法:
int stoi(string str, size_t position = 0, int base = 10);
参数:
- str:要转换的字符串。 (强制性的)
- position:起始位置。 (可选,默认值 = 0)
- base:数系的基数。 (可选,默认值 = 10)
例子:
C++
// C++ program to demonstrate
// working of stoi()
// Work only if compiler supports
// C++11 or above. Because STOI()
// was added in C++ after 2011
#include <iostream>
#include <string>
using namespace std;
// Driver code
int main()
{
string str1 = "45";
string str2 = "3.14159";
char str3[] = "31337 geek";
// type of explicit type casting
int myint1 = stoi(str1);
// type of explicit type casting
int myint2 = stoi(str2);
// type of explicit type casting
int myint3 = stoi(str3);
cout << "stoi(\"" << str1 <<
"\") is " << myint1 << '\n';
cout << "stoi(\"" << str2 <<
"\") is " << myint2 << '\n';
cout << "stoi(\"" << str3 <<
"\") is " << myint3 << '\n';
return 0;
}
stoi("45") is 45 stoi("3.14159") is 3 stoi("31337 geek") is 31337
我们可以看到,stoi()方法同时支持C++风格和C风格字符串。
我们还可以使用atoi()函数来执行此任务。
2. 使用atoi()将字符串转换为int
atol(), atoll() and atof()接受字符数组或字符串文字作为参数并以整数。它定义在<stdlib.h>头文件。该函数是 C++ 从 C 语言继承的,因此它仅适用于 C 风格的字符串,即字符数组。
如果你观察atoi()靠近一点你会发现它代表:
简单来说 atoi() 的细分
例子:
C++
// C++ program to demonstrate the
// functioning of the atoi() function
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
char* str1 = "141";
char* str2 = "3.14";
int res1 = atoi(str1);
int res2 = atoi(str2);
cout << "atoi(" << str1 << ") is " << res1 << "\n";
cout << "atoi(" << str2 << ") is " << res2 << "\n";
return 0;
}
atoi(141) is 141 atoi(3.14) is 3
stoi() vs atoi()
stoi() |
atoi() |
---|---|
1. C++ 11中添加stoi() | 1. atoi() 是一个遗留的 C 风格函数 |
2. stoi() 适用于 C++ 字符串和 C 风格字符串(字符数组和字符串文字) | 2.atoi()仅适用于C风格字符串(字符数组和字符串文字) |
3.stoi()最多可以带三个参数,第二个参数用于 起始索引和第三个参数是输入数字的基数。 |
3.atoi()仅采用一个参数并返回一个整数值 |
4. 用法: int stoi (const string& str, size_t* 索引 = 0, int 基数 = 10); |
4. 用法: int atoi (const char * str); |
3. 使用 stringstream 类将字符串转换为int
C++ 中的 stringstream 类允许我们关联一个要读取的字符串,就好像它是一个流一样。我们可以使用它轻松地将数字字符串转换为整数、浮点数或双精度数。这字符串流类定义在 <流> 头文件。
它的工作方式与 C++ 中的其他输入和输出流类似。我们首先创建一个 stringstream 对象,如下所示:
用法:
stringstream ss;
然后使用 ( << ) 插入运算符将数字字符串插入其中。
例子:
ss << myString; ss << myCstring; ss << myInt; or float, or double, etc.
最后,我们使用 ( >> ) 提取运算符从流中提取数值。
例子:
ss >> myChar; ss >> myCstring; ss >> myInt;
下面的 C++ 程序演示了如何使用 stringstream 对象将字符串转换为 int:
C++
// C++ program to demonstrate the
// use of a stringstream to
// convert string to int
#include <iostream>
#include <sstream>
using namespace std;
// Driver code
int main()
{
string s = "12345";
// object from the class stringstream
stringstream geek;
// inserting string s in geek stream
geek << s;
// The object has the value 12345
// and stream it to the integer x
int x = 0;
geek >> x;
// Now the variable x holds the
// value 12345
cout << "Value of x + 1 : " << x + 1;
return 0;
}
Value of x + 1 : 12346
总而言之,stringstream 是一种操作字符串的便捷方法。此方法也适用于 C 样式字符串或 C++ 样式字符串。
4. 使用sscanf()将字符串转换为int
'sscanf()'是一个类似于scanf()的C风格函数。它从字符串而不是标准输入读取输入。
sscanf 的语法:
int sscanf (const char * source, const char * formatted_string, ...);
参数:
- 来源- 源字符串。
- formatted_string- 包含以下内容的字符串格式说明符.
- ……:- 变量参数列表,其中包含我们要存储输入数据的变量的地址。
这些参数的数量至少应与格式说明符存储的值的数量一样多。
返回:
- 成功时,该函数返回填充的变量数。
- 如果输入失败,在成功读取任何数据之前,将返回函数结尾(EOF)。
例子:
C++
// C++ program to demonstrate
// the working of sscanf() to
// convert a string into a number
#include <iostream>
using namespace std;
int main()
{
const char* str = "12345.0000046";
float x;
sscanf(str, "%f", &x);
cout << "The value of x : " << x << endl;
return 0;
}
The value of x : 12345
5.使用For循环将字符串转换为int
这是 string-to-int 转换的简单方法,我们将每个字符与其 ASCII 值进行比较,然后获取该数字字符的值。
下面是使用for循环将字符串转换为数字的C++程序:
C++
// C++ Program to convert String
// into number using for loop
#include <bits/stdc++.h>
using namespace std;
int main()
{
string number = "13";
int i = 0;
// Traversing string
for (char c : number) {
// Checking if the element is number
if (c >= '0' && c <= '9') {
i = i * 10 + (c - '0');
}
// Otherwise print bad output
else {
cout << "Bad Input";
return 1;
}
}
cout << i;
}
13
但是,上述函数不能用于将负数字符串转换为整数。为此,我们必须检查字符串的第一个索引是否包含 “-” 符号,如果是,那么我们会将数字转换为整数,然后在其前面使用此 “-” 符号来表示字符串中存在的数字是一个负数。
6. 使用strtol()将字符串转换为int
使用 strtol 函数:它将字符串分别转换为长整型值。
strtol()的语法:
long int strtol(const char* str, char** endptr, int base);
参数:
- str- 指向要转换的以空字符结尾的字节字符串的指针
- endptr- 引用指向字符的指针。该函数将第一个无效字符的地址存储在*endptr 中。如果 endptr 是空指针,则该函数不存储此信息。
- base-解释字符串的数字基数。必须介于 2 到 36(含)或 0 之间。如果基数为 0,则该函数根据字符串本身确定基数。如果基数为 16,则字符串可能以前缀 “0x” 或 “0X” 开头,在这种情况下,数字将被解析为十六进制值。
返回:
- 如果字符串为空或不包含任何数字,则返回 0。
- 如果转换成功,该函数将返回转换后的长整型值。
- 如果转换失败,该函数返回 0 并设置 *endptr 指向字符串的开头。
例子:
C++
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "12345";
char* endptr;
long int value = strtol(str, &endptr, 10);
if (endptr == str) {
printf("No digits were found\n");
} else if (*endptr != '\0') {
printf("Invalid input: %s\n", str);
} else {
printf("The value is %ld\n", value);
}
return 0;
}
The value is 12345
时间复杂度:O(N),其中 N 是字符串中的字符数。
辅助空间:O(1)
相关用法
- C++ String转Integer用法及代码示例
- C++ String转Date用法及代码示例
- C++ String转Integer Vector用法及代码示例
- C++ String转size_t用法及代码示例
- C++ String转Char Array用法及代码示例
- C++ String Assign()用法及代码示例
- C++ String Data()用法及代码示例
- C++ String Find()用法及代码示例
- C++ String append()用法及代码示例
- C++ String at()用法及代码示例
- C++ String back()用法及代码示例
- C++ String begin()用法及代码示例
- C++ String c_str()用法及代码示例
- C++ String capacity()用法及代码示例
- C++ String cbegin()用法及代码示例
- C++ String cend()用法及代码示例
- C++ String clear()用法及代码示例
- C++ String compare()用法及代码示例
- C++ String copy()用法及代码示例
- C++ String crbegin()用法及代码示例
- C++ String crend()用法及代码示例
- C++ String empty()用法及代码示例
- C++ String end()用法及代码示例
- C++ String erase()用法及代码示例
- C++ String find_first_not_of()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Convert String to int in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。