C/C++ 整數轉字串的方法與範例

本篇介紹 C/C++ 整數轉字串 int to string 的方法與範例,在寫程式時經常會遇到需要將整數轉成字串的情況,本篇整理了過往我遇到的問題與解決經驗整理出幾種整數轉成字串方式,內容包含 Windows 下的 itoa 以及 Linux / macOS 的對應方法,看完本篇內容以後你將更能應付各種平台下的 int to string 整數轉成字串應對處理,

以下 C/C++ 整數轉字串的方法與範例分別是,

  • Windows 下的 itoa
  • Linux 下沒有 itoa,那自幹一個 itoa
  • C 的整數轉字串通用方法
  • C++ std::to_string()

那麼就開始吧!

Windows 下的 itoa

最早我是在 Windows 上寫程式的,隨著寫程式的經驗變多,自然也記得遇到字串轉整數時就會想到 itoa 這函式,那時 itoa 用得真順手啊
所以你是在 Windows 下寫程式要字串轉整數的話你可以直接使用 itoa,

cpp-integer-to-string.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ cpp-integer-to-string.cpp -o a.out
#include <stdio.h>

int main() {
char buffer[32];
int integer = 12345;

itoa(integer, buffer, 10);
printf("%s\n", buffer);

system("pause");
return 0;
}

Linux 下沒有 itoa,那自幹一個 itoa

那在 Linux itoa 怎麼會編譯錯誤??itoa was not declared in this scope 什麼!Linux itoa 不存在的函式!晴天霹靂!!
itoa 不是一個標準的 api,itoa 是 Windows 下才有的 api,Linux 下沒有 itoa~當然 macOS / unix-like 也~沒~有~

還記得當初我第一次在 Linux 下寫程式試了老半天一直無法成功,原來是 Linux 下沒有這個 api 呀!所以如果你是在 Linux 下堅持要用 itoa 的話可以考慮自幹一個 itoa。

自幹一個 itoa 範例如下,一開始先用 sign 變數紀錄正負號,如果是負數的話就將 sign 設定成 -1 且 n 去除負號,負號會在稍後加回去。
接著用迴圈將數字轉成字串,用 mod 10 取餘數的方式來得到個位數字,再加上 '0' 就可以得到該數字的字元,然後 n = n/10 再重複步驟,可以發現這樣處理下來得到數字字串是相反的,所以最後會再用 reverse 反轉的方式得到原本的數字順序。
全部數字都轉換成字串後再把負號加回去,最後 reverse 反轉整個字串就得到最終的字串了,reverse 在之前有介紹過了細節就略過,想了解細節可以參考之前 reverse 的文章

cpp-integer-to-string2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// g++ cpp-integer-to-string2.cpp -o a.out
#include <stdio.h>

void reverse(char *first, char *last) {
for (;first < last; first++,last--) {
// swap
char tmp = *first;
*first = *last;
*last = tmp;
}
}

void itoa(int n, char *s) {
int sign = 1;
if (n < 0) {
sign = -1;
n = -n;
}
int i = 0;
while (n != 0) {
s[i++] = n%10 + '0';
n = n/10;
}

if (sign < 0)
s[i++] = '-';
s[i] = '\0';

reverse(s, s+i-1);
}

int main() {
char s[128];
itoa(12345, s);
printf("%s\n", s);

char s2[128];
itoa(-12345, s2);
printf("%s\n", s2);
return 0;
}

C 的整數轉字串通用方法

那如果今天我不想為了整數轉字串這功能自幹一個 itoa 怎辦?

如果你寫程式的經驗夠豐富的話一定會想起有個函式叫 sprintf,用 sprintf 就可以達成整數轉字串的功效了,sprintf 的功能就像 printf 一樣,只是 sprintf 它是輸出到字串陣列裡,範例如下,

cpp-integer-to-string3.cpp
1
2
3
4
5
6
7
8
9
10
11
// g++ cpp-integer-to-string3.cpp -o a.out
#include <stdio.h>

int main() {
char buffer[32];
int integer = 12345;

sprintf(buffer, "%d", integer);
printf("%s\n", buffer);
return 0;
}

如此一來,不管我們在 Windows / Linux / macOS 哪個平台下寫程式都能夠用一種通用的方式來完成整數轉字串,這樣腦袋就可以省下記憶體空間去裝其他東西了XD

C++ 的整數轉字串方法

後來在開發大型程式中也漸漸了解到開發速度的重要性,有句話叫天下武功唯快不破,應該不希望慢慢開發等到對手比你快推出產品吧,因此後來也對於 C++ 如何快速開發深感興趣。

如果你想用 C++ 整數轉字串的方式的話可以考慮使用 std::stringstream 來整數轉字串,使用 std::stringstream 的好處是可以接受 int、long、short、float、double 各種類型,你不需特別告訴 std::stringstream 是什麼類型,使用 std::stringstream 要 #include <sstream> 標頭檔,

cpp-integer-to-string4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-integer-to-string4.cpp -o a.out
#include <iostream>
#include <sstream>
using namespace std;

int main() {
std::stringstream ss;
int integer = 12345;

ss << integer;

cout << ss.str() << "\n";
printf("%s\n", ss.str().c_str());
return 0;
}

注意 stringstream::str() 回傳的是 std::string,要取得字元陣列的話要再使用 .c_str() 像上面範例那樣。

C++ std::to_string()

C++11 有提供 std::to_string() 可以使用,使用時要引入標頭檔 <string>,用法範例如下,

cpp-integer-to-string5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// g++ cpp-integer-to-string5.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
using namespace std;

int main() {
int i = 10;
float f = 12.3f;
double d = 23.4;

std::string s1 = std::to_string(i);
std::string s2 = std::to_string(f);
std::string s3 = std::to_string(d);

cout << s1 << "\n";
cout << s2 << "\n";
cout << s3 << "\n";

return 0;
}

輸出如下,

1
2
3
10
12.300000
23.400000

延伸閱讀:C/C++ 字串轉數字的4種方法

以上就是 C/C++ 整數轉字串的方法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
itoa - C++ Reference
http://www.cplusplus.com/reference/cstdlib/itoa/
sprintf - C++ Reference
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
c - Where is the itoa function in Linux? - Stack Overflow
https://stackoverflow.com/questions/190229/where-is-the-itoa-function-in-linux
c - error: itoa was not declared in this scope - Stack Overflow
https://stackoverflow.com/questions/6462938/error-itoa-was-not-declared-in-this-scope
不要再寫itoa了,數字轉字串不用寫itoa | History
https://cslin.wordpress.com/2009/09/03/不要再寫itoa了,數字轉字串不用寫itoa/
lib/libc/itoa.c - kernel/lk - Git at Google
https://android.googlesource.com/kernel/lk/+/qcom-dima-8x74-fixes/lib/libc/itoa.c
itoa function (or similar) in Linux [SOLVED] | DaniWeb
https://www.daniweb.com/programming/software-development/threads/148080/itoa-function-or-similar-in-linux

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 字串轉數字的4種方法
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例