Linux 隨機產生文字檔或二進制檔

本篇 ShengYu 介紹在 Linux 隨機產生文字檔或二進制檔的方法,以下內容包含了產生隨機的二進制檔,也有產生隨機內容的文字檔,甚至還有產生隨機內容的圖片檔。本方法除了在 Linux 下可用以外,在 macOS 下也適用唷!

為什麼要產生隨機內容而不是產生都是零的內容呢?例如:有時使用內容都是 0 的內容可能達不到我們測試的需求,比如我想要測試壓縮大檔案的時間,那麼使用都是零的內容檔案就會壓縮的非常快,因為檔案裡的內容都一樣嘛,這樣就反應不出真實的壓縮時間,那麼就會想要產生隨機內容。

以下 Linux 產生固定大小的隨機內容檔案介紹將分為這幾部份,

  • Linux 產生隨機內容的二進制
  • Linux 產生隨機內容的文字檔
  • Linux 產生隨機內容的圖片檔

那我們開始吧!

Linux 產生隨機內容的二進制

簡單示範一下用 dd 指令產生隨機內容的二進制 1MB 跟 2MB 檔案大小的例子,dd 指令在 Linux 與 macOS 下都可以使用,dd 的 bs 參數預設單位為 byte,

1
2
3
$ dd if=/dev/urandom of=1m.bin bs=1M count=1 # 1M
$ dd if=/dev/urandom of=2m.bin bs=1M count=2 # 2M
$ dd if=/dev/urandom of=3m.bin bs=1M count=3 # 3M

如果遇到 dd: invalid number: ‘1m’ 或者 dd: bs: illegal numeric value 這種錯誤訊息的話,就表示 bs 的單位有問題,我自己的經驗是 Ubuntu 下 bs 的單位不行用小寫 m,要用大寫 M。macOS 下 bs 的單位也是要用大寫 M,不行用小寫 m。

bs 要改用其他單位的話,例如 KB,

1
2
$ dd if=/dev/urandom of=random.bin bs=1k count=1 # 1K
$ dd if=/dev/urandom of=random.bin bs=512k count=1 # 512K

如果 bs 的單位遇到有問題,就大寫小寫交換試試看。

如果不要產生隨機的內容,而是要產生都是 0 的內容的話,只要將上述的 /dev/urandom 換成 /dev/zero 就可以產生都是零的內容了。

Linux 產生隨機內容的文字檔

以下示範一下產生隨機內容的文字檔,使用 base64 指令來將 /dev/urandom 產生的串流隨機內容編碼成文字,再搭配 head 指令取前 n bytes 資料。

1
2
3
4
$ base64 /dev/urandom | head -c 100 > random.txt
$ base64 /dev/urandom | head -c 1024 > 1k.txt
$ base64 /dev/urandom | head -c 1048567 > 1m.txt
$ base64 /dev/urandom | head -c "$((1024*1024))" > 1m.txt

把上述的例子裡的 /dev/urandom 改成 /dev/zero 就是填充 0 囉。

Linux 產生隨機內容的圖片檔

以下示範一下產生隨機內容的圖片檔,這邊需要搭配 convert 指令來產生圖片檔,
convert 指令在 Ubuntu 下可以用 sudo apt install imagemagick,convert 指令在 macOS 下可以用 brew install imagemagick 安裝。

以下示範產生 320x240 大小的隨機內容圖片檔,

1
2
$ mx=320;my=240;head -c "$((3*mx*my))" /dev/urandom | \
convert -depth 8 -size "${mx}x${my}" RGB:- random.png

產生的圖片檔範例如下所示,

產生的圖片檔如果要以當下日期為命名的話,可以配合 date 指令這樣使用,

1
2
$ mx=320;my=240;head -c "$((3*mx*my))" /dev/urandom | \
convert -depth 8 -size "${mx}x${my}" RGB:- random-$(date +%Y-%m-%d-%H%M%S).png

以上就是 Linux 隨機產生文字檔或二進制檔的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
Quickly create a large file on a Linux system
https://stackoverflow.com/questions/257844/quickly-create-a-large-file-on-a-linux-system
How to create a random .txt(Human readable text like ascii) file in linux - Super User
https://superuser.com/questions/692175/how-to-create-a-random-txthuman-readable-text-like-ascii-file-in-linux
command line - Random image generator - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/289572/random-image-generator

其它相關文章推薦
Linux 常用指令教學懶人包
Linux wget 下載檔案用法與範例
Linux sed 字串取代用法與範例
Linux find 尋找檔案/尋找資料夾用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux tee 同時螢幕標準輸出和輸出到檔案用法與範例
Linux xargs 參數列表轉換用法與範例
Linux tail 持續監看檔案輸出用法與範例
Linux du 查詢硬碟剩餘空間/資料夾容量用法與範例

C++ std::string::substr 子字串用法與範例

本篇介紹 C/C++ std::string::substr 子字串的用法與範例,substr 就是從字串中擷取出一段子字串的一個成員函式,substr 可使指定子字串的起始位置一直到結束字元,substr 也可以子字串的指定起始位置跟長度,接下來看看 substr 的使用範例。

要使用 std::string::substr 的話,需要引入的標頭檔: <string>

C++ std::string::substr 子字串使用範例

以下為 std::string::substr 子字串的範例,範例中示範指定起始位置的子字串,另外還示範指定起始位置跟長度的例子,substr 傳回的子字串是新建立一個字串

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

int main() {
std::string str = "Hello World";
std::string str2("World");

std::cout << str.substr(1) << "\n";

std::cout << str.substr(6) << "\n";

std::string str3 = str.substr(1, 4);
std::cout << str3 << "\n";

str3 = "123456789abcdef";
std::cout << str3 << "\n";

return 0;
}

輸出如下,

1
2
3
4
ello World
World
ello
123456789abcdef

C++ std::string::find 搭配 substr 取出子字串

如果有找到的話會回傳找到的位置,如果沒有找到會回傳 string::npos,以下例子示範有找到跟沒找到的情況,並且有找到的話把位置印出來,

std-string-substr2.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
// g++ std-string-substr2.cpp -o a.out
#include <iostream>
#include <string>

int main() {
std::string str = "Hello World";
std::string str2("World");

std::size_t found = str.find(str2);
if (found != std::string::npos) {
std::cout << "found at " << found << "\n";
std::cout << str.substr(found+1) << "\n";
}

found = str.find("Wo");
if (found != std::string::npos) {
std::cout << "found at " << found << "\n";
std::cout << str.substr(found+1) << "\n";
}

found = str.find("lo");
if (found != std::string::npos) {
std::cout << "found at " << found << "\n";
std::cout << str.substr(found+1) << "\n";
}

return 0;
}

輸出如下,

1
2
3
4
5
6
found at 6
orld
found at 6
orld
found at 3
o World

延伸閱讀:C++ std::string::find 搜尋字串用法與範例

C++ std::string::rfind 搭配 substr 取出子字串

std::string::rfind 是從字串右邊向左搜尋,經常在路徑中擷取檔案名稱或目錄名稱時和 substr 搭配使用,做法是找路徑中最右邊的 '/' 字元,再從找到的 '/' 字元起始位置之後用 substr 取出子字串。另外補充一下 linux / macOS 的路徑分隔字元為 /,Windows 的路徑分隔字元為 \,在程式裡要用兩個反斜線 \\ 代表 \

std-string-substr3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-string-substr3.cpp -o a.out
#include <iostream>
#include <string>

int main() {
std::string str = "/home/shengyu/main.cpp";
std::size_t found = str.rfind("/");
if (found != std::string::npos) {
std::cout << "found at " << found << "\n";
std::cout << str.substr(found+1) << "\n";
} else {
std::cout << "not found\n";
}

return 0;
}

輸出如下,找到最右邊的 / 字元的起始位置後,並且用 string::substr 擷取出子字串,

1
2
found at 13
main.cpp

延伸閱讀:C++ std::string::rfind 搜尋字串用法與範例

以上就是 C++ std::string::substr 子字串用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
string::substr - C++ Reference
https://www.cplusplus.com/reference/string/string/substr/

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
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 用法與範例

C++ std::string::rfind 搜尋字串用法與範例

本篇介紹 C/C++ std::string::rfind 搜尋字串的用法與範例,std::string::rfind 跟 std::string::find
不同的點是 std::string::rfind 是從右邊向左搜尋,在一些情況下,從字串右邊向左搜尋比較有效率,接下來看看 rfind 的使用範例。

要使用 std::string::rfind 的話,需要引入的標頭檔: <string>

C++ std::string::rfind 由後往前搜尋字串使用範例

如果要由後往前搜尋字串的話可以改使用 std::string::rfind,rfind 字面上的意思就是從字串右邊向左搜尋,在某些情況下可以增進搜尋效率,例如我要在絕對路徑中擷取檔案名稱或目錄名稱時,通常會先去找絕對路徑中最右邊的 '/' 字元,再從找到的 '/' 字元起始位置之後取出子字串。另外補充一下 linux / macOS 的路徑分隔字元為 /,Windows 的路徑分隔字元為 \,在程式裡要用兩個反斜線 \\ 代表 \。如果有找到的話會回傳找到的位置,如果沒有找到會回傳 string::npos,以下例子示範有找到跟沒找到的情況,並且有找到的話把位置印出來,

std-string-rfind.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-string-rfind.cpp -o a.out
#include <iostream>
#include <string>

int main() {
std::string str = "/home/shengyu/Desktop";
std::size_t found = str.rfind("/");
if (found != std::string::npos) {
std::cout << "found at " << found << "\n";
std::cout << str.substr(found+1) << "\n";
} else {
std::cout << "not found\n";
}

return 0;
}

輸出如下,找到最右邊的 / 字元的起始位置在 13,並且用 string::substr 擷取出子字串,

1
2
found at 13
Desktop

延伸閱讀:C++ std::string::substr 子字串用法與範例

以上就是 C++ std::string::rfind 搜尋字串用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
string::rfind - C++ Reference
https://www.cplusplus.com/reference/string/string/rfind/

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
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 用法與範例

C/C++ 實作 atoi 的方法

本篇 ShengYu 介紹 C/C++ 實作 atoi 字串轉數字的方法,標準函式庫已經有提供 atoi,如果是要自己實作 atoi 可以參考這篇的做法,有時候面試考題也會考實作 atoi,所以多學一些是好事,另外要注意的是 atoi 可能會與標準函式庫提供的同名重複定義,要確認輸入型別是否不一樣,否則的話就換個名字,避免衝突。

以下的 myatoi 字串轉數字實作方法為先判斷正負號,如果是負號開頭的話就在 sign 變數設定為 -1 記錄一下,最後的數字再乘上 sign 即可,主要邏輯為一個 while 迴圈去使用 isdigit 判斷每個字元是不是數字,該字元是數字的話就將字元減去 '0' 就可以得到數字,然後將該數字再加上之前的 sum * 10,最後整個 while 迴圈會遇到 '\0' 結束字元時 isdigit 會判斷成不是數字進而終止 while 迴圈,最後再將 sum 乘上 sign 變數就可以回傳最終結果。

這邊有對數字前有多餘的空格作處理,有多餘的空格的話可以使用 isspace 來跳過該空格,另外還有針對 32 bit 整數邊界進行處理,大於 2147483647 回傳 2147483647,小於 -2147483648 則回傳 -2147483648,另外輸入是超長的數字字串是 long 存不下的話,也會針對 len 長度太長進行邊界處理。

cpp-implement-atoi.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
42
43
44
45
46
47
// g++ cpp-implement-atoi.cpp -o a.out
#include <stdio.h>
#include <ctype.h>

int myatoi(const char *s) {
long sum = 0;
int i = 0;
int sign = 1;

while (isspace(s[i])) { i++; }

if (s[i] == '-') {
sign = -1;
i++;
} else if (s[i] == '+') {
i++;
}

int len = 0;
while (isdigit(s[i])) {
sum = sum * 10 + s[i] - '0';
i++;
len++;
if (len > 10)
break;
}

sum = sum * sign;
if (sum > 2147483647)
return 2147483647;
else if (sum < -2147483648)
return -2147483648;
else
return sum;
}

int main() {
printf("atoi: %d\n", myatoi("123"));
printf("atoi: %d\n", myatoi("0032"));
printf("atoi: %d\n", myatoi("4193 with words"));
printf("atoi: %d\n", myatoi(" -42"));
printf("atoi: %d\n", myatoi("-91283472332"));
printf("atoi: %d\n", myatoi("+1"));
printf("atoi: %d\n", myatoi("20000000000000000000"));
printf("atoi: %d\n", myatoi("00000-42a1234"));
return 0;
}

輸出如下,

1
2
3
4
5
6
7
8
atoi: 123
atoi: 32
atoi: 4193
atoi: -42
atoi: -2147483648
atoi: 1
atoi: 2147483647
atoi: 0

atoi 同時也是 LeetCode 的題目,可以看看 LeetCode 8. String to Integer (atoi),可以看看我之前的 解題

以上就是 C++ C/C++ 實作 atoi 的方法介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 整數轉字串的方法與範例
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 用法與範例

Visual Studio Code 存檔自動排版的2種方式

本篇介紹 Visual Studio Code 存檔自動排版 format,開啟 Visual Studio Code 存檔自動排版有兩種方式,

VS Code 存檔自動排版的方法分為這兩種方式,

  • 從 UI 介面開啟存檔自動排版
  • 從 setting.json 設定檔開啟存檔自動排版

從 UI 介面開啟存檔自動排版

Ctrl + , 快捷鍵打開設定 setting,macOS 快捷鍵是 Cmd + ,

選擇 Text Editor > Formatting,將 Format On Save 勾選起來,這樣就會存檔時自動排版了,中文介面的話是選擇 文字編輯器 > 格式化

從 setting.json 設定檔開啟存檔自動排版

從 setting.json 設定檔開啟存檔自動排版的方法就是在 setting.json 加上 "editor.formatOnSave": true 就是存檔時進行自動排版,也可以關閉另外使用 Alt + Shift + F 手動執行自動排版,

setting.json
1
2
3
{
"editor.formatOnSave": true
}

以上就是 Visual Studio Code 存檔自動排版的2種方式介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
vscode settings - How do you format code on save in VS Code - Stack Overflow
https://stackoverflow.com/questions/39494277/how-do-you-format-code-on-save-in-vs-code
https://linuxpip.org/vscode-format-on-save/

C/C++ __FILENAME__ macros 巨集

本篇 ShengYu 介紹 C/C++ __FILENAME__ macros 巨集的用法,C/C++ 標準的預定義巨集裡沒有原始檔檔名 __FILENAME__ 巨集,只有原始檔檔案路徑 __FILE__ 巨集,以下內容介紹透過一些方法來得到 __FILENAME__ 巨集。

C/C++ 標準的預定義巨集 macros 中有 __FILE__,通常是印出該原始檔的絕對路徑,例如:

1
/full/path/to/file.c

但是如果只想印出原始檔的檔名的話,像下面輸出這樣,要怎麼做呢?

1
file.c

由於 C/C++ 標準的預定義巨集沒有 __FILENAME__ 這樣的巨集可以使用,那我們就自己作一個 __FILENAME__ 巨集,
如下範例,原理是用 strrchr 從右邊開始尋找 '/' 有找到的話就回傳找到的指標+1,使用 strrchr 需要加入標頭檔 #include <string.h>

1
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

如果是 Windows 平台的話,就將 '/' 換成 '\\',如下範例,

1
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

以上就是 C/C++ __FILENAME__ macros 巨集介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

參考
https://stackoverflow.com/questions/8487986/file-macro-shows-full-path

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ strrchr 用法與範例
C/C++ 新手入門教學懶人包
C/C++ 字串搜尋的3種方法
C/C++ strstr 用法與範例

C/C++ strrchr 用法與範例

本篇 ShengYu 介紹 C/C++ strrchr 用法與範例,strrchr 是從字串右側開始向左搜尋字元的函式,以下介紹如何使用 strrchr 函式。

C/C++ 要從字串右側開始搜尋字元可以使用 strrchr 來完成,要使用 strrchr 的話需要引入的標頭檔 <string.h>,如果要使用 C++ 的標頭檔則是引入 <cstring>
strrchr 函式原型為

1
char * strrchr(const char * str, int character);

strrchr() 會從 str 字串右側開始搜尋 character 字元,有找到會回傳指向 character 字元的指標,沒找到會回傳 NULL,來看看下面的 strrchr 用法範例吧!

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

int main() {
char str[] = "This is a c-style string";
char *pch;
pch = strrchr(str, 's');
printf("found at %d\n", pch-str+1);
return 0;
}

結果如下,字串從右側找到第一個的 s 字元在第 19 字元,

1
found at 19

另外 strrchr 也很常被用來去除路徑中的 '/' 字元進而得到檔案名稱,Windows 下則是 '\\',如下範例所示,

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

int main() {
char path[] = "/full/path/to/file.c";
char *pch;
pch = strrchr(path, '/');
printf("found at %d\n", pch-path+1);
printf("filename = %s\n", pch+1);

return 0;
}

結果如下,

1
2
found at 14
filename = file.c

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

其它參考
strrchr - C++ Reference
https://www.cplusplus.com/reference/cstring/strrchr/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ strchr 用法與範例
C/C++ 新手入門教學懶人包
C/C++ 字串搜尋的3種方法
C/C++ strstr 用法與範例
C/C++ strcmp 用法與範例
C/C++ strcat 用法與範例

C/C++ strchr 用法與範例

本篇 ShengYu 介紹 C/C++ strchr 用法與範例,strchr 是從字串左側開始向右搜尋字元的函式,以下介紹如何使用 strchr 函式。

C/C++ 要在字串裡搜尋字元可以使用 strchr 來完成,要使用 strchr 的話需要引入的標頭檔 <string.h>,如果要使用 C++ 的標頭檔則是引入 <cstring>
strchr 函式原型為

1
char * strchr(const char * str, int character);

strchr() 會從 str 字串左側開始搜尋 character 字元,有找到會回傳指向 character 字元的指標,沒找到會回傳 NULL,來看看下面的 strchr 用法範例吧!

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

int main() {
char str[] = "This is a c-style string";
char *pch;
pch = strchr(str, 's');
while (pch != NULL) {
printf("found at %d\n", pch-str+1);
pch = strchr(pch+1, 's');
}

return 0;
}

結果如下,字串中的第 4、7、13、19 字元中出現 s 字元,

1
2
3
4
found at 4
found at 7
found at 13
found at 19

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

其它參考
strchr - C++ Reference
https://www.cplusplus.com/reference/cstring/strchr/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ strrchr 用法與範例
C/C++ 新手入門教學懶人包
C/C++ 字串搜尋的3種方法
C/C++ strstr 用法與範例
C/C++ strcmp 用法與範例
C/C++ strcat 用法與範例

Hexo 特殊符號轉義問題

本篇紀錄 Hexo 特殊符號轉義問題,之前一直發現 Hexo 沒辦法顯示 < 字元,不管是在文章內還是在 {% %} 語法內,都是用一些方式避開,今天終於下定決定要解決這個問題,我發現只要 Markdown 裡面有特殊字元就會無法顯示該字元,例如:< ,後來找到轉義的方式,在 Markdown 裡將 < 替換成 &lt; 就可以顯示 < 了。

一些常用的特殊符號轉義如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
! &#33; — 驚嘆號 Exclamation mark
」 &#34; &quot; — 雙引號 Quotation mark
# &#35; — 數字標誌 Number sign
$ &#36; — 美元標誌 Dollar sign
% &#37; — 百分號 Percent sign
& &#38; &amp; — Ampersand
『 &#39; — 單引號 Apostrophe
( &#40; — 小括號左邊部分 Left parenthesis
) &#41; — 小括號右邊部分 Right parenthesis
* &#42; — 星號 Asterisk
+ &#43; — 加號 Plus sign
< &#60; &lt; 小於 Less than
= &#61; — 等於 Equals sign
- &#45; &minus; — 減號
> &#62; &gt; 大於 Greater than
? &#63; — 問號 Question mark
@ &#64; — Commercial at
[ &#91; — 中括號左邊部分 Left square bracket
\ &#92; — 反斜槓 Reverse solidus (backslash)
] &#93; — 中括號右邊部分 Right square bracket
{ &#123; — 大括號左邊部分 Left curly brace
| &#124; — 豎線 Vertical bar
} &#125; — 大括號右邊部分 Right curly brace

其他參考
Hexo 中 Markdown 特殊字符的处理方法
https://segmentfault.com/a/1190000016643268

C++ std::vector<char> 轉 std::string 的 2 種方法

本篇 ShengYu 介紹 C++ std::vector<char>std::string 的方法,

以下 C++ std::vector<char>std::string 的 2 種方法分別是,

  • 使用 string range constructor
  • 使用 for 迴圈

那我們就開始吧!

使用 string range constructor

C++ std::vector<char>std::string 可以使用 string 建構子中的 range constructor,方法如下,

cpp-vector-char-to-string.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ cpp-vector-char-to-string.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <vector>

int main() {
std::vector<char> v = {'H', 'e', 'l', 'l', 'o'};
std::string s(v.begin(), v.end());

std::cout << s;

return 0;
}

輸出如下,

1
Hello

使用 for 迴圈

另一種 C++ std::stringstd::vector<char> 可以使用 for 迴圈將 vector 裡每個元素添加到 string 裡,添加到 string 可以使用 std::string 的 +=operator 的方式或是 push_back 的方式都可以,

cpp-vector-char-to-string2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ cpp-vector-char-to-string2.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <vector>

int main() {
std::vector<char> v = {'H', 'e', 'l', 'l', 'o'};
std::string s;
for (char &c : v) {
s += c;
//s.push_back(c);
}
std::cout << s;

return 0;
}

輸出如下,

1
Hello World

以上就是 C++ std::vector<char>std::string 的 2 種方法的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
Convert a vector of chars to std::string in C++
https://www.techiedelight.com/convert-vector-chars-std-string/

其它相關文章推薦
C/C++ 新手入門教學懶人包
C++ std::string 轉 std::vector<char> 的 2 種方法
C/C++ 整數轉字串的方法與範例
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別