当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ String转int用法及代码示例


将字符串转换为 int 是 C++ 中最常遇到的任务之一。由于 string 和 int 不在同一对象层次结构中,因此我们无法像 double 到 int 或 float 到 int 转换那样执行隐式或显式类型转换。转换主要是为了我们可以转换存储为字符串的数字。

例子:

str=”191″

num=191

C++ 中有 5 种将字符串转换为数字的重要方法,如下所示:

  1. 使用stoi()函数
  2. 使用atoi()函数
  3. 使用字符串流
  4. 使用sscanf()函数
  5. 使用 for 循环
  6. 使用strtol()函数

1. 使用stoi()函数将字符串转换为int

stoi() function in C++ 将字符串作为参数并以整数形式返回其值。这种方法在当前版本的 C++ 中很流行,因为它是在 C++11 中首次引入的。

如果你仔细观察stoi(),你会发现它代表:

stoi() function with example and meaning

简单来说 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()靠近一点你会发现它代表:

Breakdown of atoi() in simple terms

简单来说 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)



相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Convert String to int in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。