將字符串轉換為 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++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。