Python not 運算子用法與範例

本篇 ShengYu 介紹 Python not 運算子用法與範例,

用 not 來取邏輯條件的相反

Python 中邏輯條件是用 True 跟 False 來表示,假設今天我要取一個結果的相反就要用到 not,
範例中 b 是 False,所以判斷 not b 就會是 True,輸出結果會印出 hello,

1
2
3
b = False
if not b:
print('hello')

判斷空字串

not 也可以來判斷字串 str 是否為空,寫法如下,

1
2
3
4
s = ''
#s = "" # 這樣寫也可以
if not s:
print('empty')

判斷空列表 []

not 也可以來判斷列表 list 是否為空,寫法如下,

1
2
3
l = []
if not l:
print('empty')

判斷空字典 {}

not 也可以來判斷字典 dict 是否為空,寫法如下,

1
2
3
d = {}
if not d:
print('empty')

判斷空元組 ()

not 也可以來判斷元組 tuple 是否為空,寫法如下,

1
2
3
t = ()
if not t:
print('empty')

下一篇介紹 xor 的用法

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

其它相關文章推薦
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

JavaScript audio play 播放音效

本篇介紹如何用 JavaScript 來播放音效,使用的方式為 Audio Object 的 play(),有時我們需要透過 JavaScript 來控制音效的播放,就像我之前寫的一樣,加上音效讓整體遊戲體驗更好,當然,你也可以用在別的用途上。

注意,<audio> 元素不支援 Internet Explorer 8 以前的版本

以下 JavaScript audio play 播放音效的用法與範例將分為這幾部份,

  • 動態的建立 audio 元素並播放
  • 動態的建立 Audio 物件並播放
  • 取得的已存在的 audio 元素並播放
  • 用 audio 元素來作音樂播放器
  • 如何只播放 1 秒

Read More

Python or 運算子用法與範例

本篇 ShengYu 介紹 Python or 運算子用法與範例,or 分別有兩種意思,一種為位元運算(bitwise operator)的 |,另一種為邏輯運算(logical operator)的 or,這兩種是不同的用法,這兩種都會在以下教學內容介紹,

位元運算

在 Python 中的 OR 位元運算要用 | 來表示,
如果還沒學習過 | 或忘記 | 的運算結果的話,可以參考下方的 | 的真值表,

1
2
3
4
5
6
a | b | a | b
--|---|------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1

那麼就馬上來練習看看 Python | 怎麼寫囉!

1
2
3
4
5
6
7
8
9
10
11
a = 0
a = a | 0
print(a)
a = 0
a = a | 1
print(a)
a = 1
a |= 0
print(a)
a = 1 | 1
print(a)

可以對照上面的真值表看看,程式結果輸出如下:

1
2
3
4
0
1
1
1

邏輯運算. 條件 A 成立或條件 B 成立

在 Python 中 or 邏輯運算子(logical operator)要用 or 來表示,對應到 C/C++ 語言的 ||
以科目分數為例,兩科目其中一科分數達到60分,就印出合格,所以條件判斷會寫成 score_a 大於等於 60 or score_b 大於等於 60,

1
2
if score_a >= 60 or score_b >= 60:
print('至少一個科目及格')

邏輯運算. 條件 A 成立或條件 B 成立或條件 C 成立

當然你也可以舉一反三一直串接下去,三科目其中一科分數達到60分,就印出合格,所以條件判斷會寫成 score_a 大於等於 60 or score_b 大於等於 60 or score_c 大於等於 60,

1
2
if score_a >= 60 or score_b >= 60 or score_c >= 60:
print('至少一個科目及格')

下一篇介紹 not 的用法

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

其它相關文章推薦
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

GIMP 去背/去除背景

本篇介紹 GIMP GIMP 去背/去除背景,

從下圖找到依顏色選擇工具,如果沒看到工具箱,請先選擇工具>工具箱把工具箱開啟,

用滑鼠選擇要去除的背景,按下左鍵就會變成虛線,確定後按 Delete 來去除背景。

以上就是 GIMP 去背/去除背景介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
GIMP 去背技巧 - 網頁設計教學站
https://www.webtech.tw/info.php?tid=GIMP_%E5%8E%BB%E8%83%8C%E6%8A%80%E5%B7%A7

其它相關文章推薦
GIMP 圖片裁切

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

本篇介紹 C/C++ std::string::find 搜尋字串的用法與範例,

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

C++ std::string::find 搜尋字串使用範例

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

std-string-find.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
// g++ std-string-find.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";
}

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

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

found = str.find("Hx");
if (found != std::string::npos) {
std::cout << "4 found\n";
} else {
std::cout << "not found\n";
}

return 0;
}

輸出如下,

1
2
3
4
found at 6
found at 6
found at 3
not found

C++ std::string::rfind 由後往前搜尋字串

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

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::find 搜尋字串用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

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

其它相關文章推薦
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 用法與範例

Ubuntu 安裝 clang,clang 多版本切換

本篇介紹 Ubuntu 安裝 clang 以及 clang 多版本切換方式,

使用 apt-get 安装最新版本的 clang

使用 apt-get 安装最新版本的 clang 指令如下,安裝前記得 apt-get update 一下,

1
2
sudo apt-get update
sudo apt-get install clang

使用 apt-get 安装指定的 clang 版本

以我 ubuntu 16.04 為例,可以安裝的版本如下,

1
2
3
4
5
6
sudo apt-get install clang-3.8
sudo apt-get install clang-3.9
sudo apt-get install clang-4.0
sudo apt-get install clang-5.0
sudo apt-get install clang-6.0
sudo apt-get install clang-8

那怎麼看可以安裝哪幾種版本呢?
apt-cache showpkg clang 列出來的資訊不太準,我用 apt-cache search clang 列出來以後自己慢慢看比較準,不過需要一些經驗,用 apt-cache showpkg clang | grep ^clang- 列出 clang- 開頭,或者 apt-cache showpkg clang | grep ^clang-[0-9] 列出 clang-0 開頭 ~ clang-9 開頭的選項,這樣看會比較輕鬆。

切換不同版本的 clang

假如你系統已經裝了兩個版本或以上的 clang,例如已經裝了 clang-3.8 與 clang-6.0,你可以直接使用 clang++-3.8clang++-6.0 來編譯 C++ 程式,或者你可以透過下列方式來選擇預設 clang 要使用哪個版本,假設我要把 clang-6.0 作為我的預設 clang,就輸入這樣的指令,把 clang-3.8 優先權設定為 38,clang-6.0 優先權設為 60 (越高越優先),

1
2
3
4
# clang-3.8
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 38 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-3.8
# clang-6.0
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 60 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-6.0

這邊我是一起設定 clang 與 clang++ 一起作動,你可以單獨分開設定,後面不要加 --slave 就可,

這時候你可以用 clang --versionclang++ --version 指令來檢查確認一下當前 clang 使用的版本,

1
2
3
4
5
6
7
8
9
10
11
$ clang --version
clang version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

$ clang++ --version
clang version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

輸入 sudo update-alternatives --config clang 來選擇使用哪一種版本

1
2
3
4
5
6
7
8
9
10
$ sudo update-alternatives --config clang
There are 2 choices for the alternative clang (providing /usr/bin/clang).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/clang-6.0 60 auto mode
1 /usr/bin/clang-3.8 38 manual mode
2 /usr/bin/clang-6.0 60 manual mode

Press <enter> to keep the current choice[*], or type selection number:

然後在 selection number: 輸入 1 按 enter 的話,會手動切換成 clang-3.8(原本為 0 自動模式是按優先權決定)之後再用 clang --version 去確認一下當前 clang 使用的版本應該就切換成 clang-3.8 了,

1
2
3
4
5
$ clang --version
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

clang update-alternatives 連動更多相關程式的版本

稍早有介紹將 clang 與 clang++ 的版本使用 update-alternatives 一起連動,但通常還有更多的 clang 相關工具也要一起連動,例如:clang-format、llvm-ar、llvm-link 等等,以下提供一個方便的腳本來連動這些事情,有些執行檔舊版本不一定有,可以註解掉,挑選你想要連動的相關程式就好,

update-alternatives-clang.sh
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
48
49
50
51
52
#!/usr/bin/env bash

function update-alternatives-clang() {
local version=$1
local priority=$2

update-alternatives \
--install /usr/bin/clang clang /usr/bin/clang-${version} ${priority} \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-${version} \
--slave /usr/bin/asan_symbolize asan_symbolize /usr/bin/asan_symbolize-${version} \
--slave /usr/bin/c-index-test c-index-test /usr/bin/c-index-test-${version} \
--slave /usr/bin/clang-check clang-check /usr/bin/clang-check-${version} \
--slave /usr/bin/clang-cl clang-cl /usr/bin/clang-cl-${version} \
--slave /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-${version} \
--slave /usr/bin/clang-format clang-format /usr/bin/clang-format-${version} \
--slave /usr/bin/clang-format-diff clang-format-diff /usr/bin/clang-format-diff-${version} \
--slave /usr/bin/clang-import-test clang-import-test /usr/bin/clang-import-test-${version} \
--slave /usr/bin/clang-include-fixer clang-include-fixer /usr/bin/clang-include-fixer-${version} \
--slave /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-${version} \
--slave /usr/bin/clang-query clang-query /usr/bin/clang-query-${version} \
--slave /usr/bin/clang-rename clang-rename /usr/bin/clang-rename-${version} \
--slave /usr/bin/clang-reorder-fields clang-reorder-fields /usr/bin/clang-reorder-fields-${version} \
--slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-${version} \
--slave /usr/bin/lldb lldb /usr/bin/lldb-${version} \
--slave /usr/bin/lldb-server lldb-server /usr/bin/lldb-server-${version} \
--slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${version} \
--slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-${version} \
--slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-${version} \
--slave /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-${version} ${priority} \
--slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-${version} \
--slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-${version} \
--slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-${version} \
--slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-${version} \
--slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-${version} \
--slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-${version} \
--slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-${version} \
--slave /usr/bin/llvm-mcmarkup llvm-mcmarkup /usr/bin/llvm-mcmarkup-${version} \
--slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-${version} \
--slave /usr/bin/llvm-objcopy llvm-objcopy /usr/bin/llvm-objcopy-${version} \
--slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-${version} \
--slave /usr/bin/llvm-profdata llvm-profdata /usr/bin/llvm-profdata-${version} \
--slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${version} \
--slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-${version} \
--slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-${version} \
--slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-${version} \
--slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-${version} \
--slave /usr/bin/llvm-strip llvm-strip /usr/bin/llvm-strip-${version} \
--slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-${version} \
--slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-${version}
}

update-alternatives-clang $1 $2

例如我要將 clang-6.0、clang++-6.0、lldb-6.0、llvm-ar-6.0、llvm-link-6.0 … 加入 update-alternatives --config clang 的選項裡的話,執行 update-alternatives-clang.sh 腳本後面接上版本優先權這樣就可以了!

1
sudo update-alternatives-clang.sh 6.0 60

如果是要將 clang-8、clang++-8 … 加入 update-alternatives --config clang 的選項裡的話,就這樣下,

1
sudo update-alternatives-clang.sh 8 80

其他參考
update-alternatives-clang.sh · GitHub
https://gist.github.com/junkdog/70231d6953592cd6f27def59fe19e50d

其它相關文章推薦
Ubuntu 安裝 gcc/g++,gcc/g++ 多版本切換

Linux nc 測試 UDP 有沒有通

本篇 ShengYu 將介紹如何使用 Linux 下的 nc 指令網路診斷工具來檢查UDP有沒有通。

範例. 測試檢查 UDP 有沒有通

測試 UDP 封包到有沒有通

1
nc -z -v -u <ip> <port>

參數說明
-z zero io mode
-v verbose
-u UDP mode

範例. 檢查 1-65535 port 有開哪些 UDP port

檢查伺服器 1-65535 port 有開哪些 UDP port

1
nc -vnzu 192.168.1.8 1-65535

其他參考
How to Test Port [TCP/UDP] Connectivity from a Linux Server – The Geek Diary
https://www.thegeekdiary.com/how-to-test-porttcp-udp-connectivity-from-a-linux-server/
centos - Testing UDP port connectivity - Server Fault
https://serverfault.com/questions/416205/testing-udp-port-connectivity
Netcat(Linux nc 指令)網路管理者工具實用範例 - G. T. Wang
https://blog.gtwang.org/linux/linux-utility-netcat-examples/

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

Python and 運算子用法與範例

本篇 ShengYu 介紹 Python and 運算子用法與範例,and 分別有兩種意思,一種為位元運算(bitwise operator)的 &,另一種為邏輯運算(logical operator)的 and,這兩種是不同的用法,這兩種都會在以下教學內容介紹,

位元運算

在 Python 中的 AND 位元運算要用 & 來表示,
如果還沒學習過 & 或忘記 & 的運算結果的話,可以參考下方的 & 的真值表,

1
2
3
4
5
6
a | b | a & b
--|---|------
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

那麼就馬上來練習看看 Python & 怎麼寫囉!

1
2
3
4
5
6
7
8
9
10
11
a = 0
a = a & 0
print(a)
a = 0
a = a & 1
print(a)
a = 1
a &= 0
print(a)
a = 1 & 1
print(a)

可以對照上面的真值表看看,程式結果輸出如下:

1
2
3
4
0
0
0
1

邏輯運算. 條件 A 成立且條件 B 也成立

在 Python 中 and 邏輯運算子(logical operator)要用 and 來表示,對應到 C/C++ 語言的 &&
以科目分數為例,兩科目分數都達到60分,就印出合格,所以條件判斷會寫成 score_a 大於等於 60 and score_b 大於等於 60,

1
2
if score_a >= 60 and score_b >= 60:
print('二個科目及格')

邏輯運算. 條件 A 成立且條件 B 也成立且條件 C 也成立

當然你也可以舉一反三一直串接下去,三科目分數都達到60分,就印出合格,所以條件判斷會寫成 score_a 大於等於 60 and score_b 大於等於 60 and score_c 大於等於 60,

1
2
if score_a >= 60 and score_b >= 60 and score_c >= 60:
print('三個科目及格')

下一篇介紹 or 的用法

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

其它相關文章推薦
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

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 用法與範例

Hexo landscape 主題優化

介面改中文

在 _config.yml 調整語言從英文 default 改為繁體中文 zh-TW,

_config.yml
1
2
3
author: author
- language: default
+ language: zh-TW

有些翻譯不好或想改名稱的話可以到 themes/landscape/languages/zh-TW.yml 檔案直接修改成你想要的名字,zh-TW.yml 內容長這樣

themes/landscape/languages/zh-TW.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
categories: 分類
search: 搜尋
tags: 標籤
tagcloud: 標籤雲
tweets: 推文
prev: 上一頁
next: 下一頁
comment: 留言
archive_a: 彙整
archive_b: 彙整:%s
page: %d
recent_posts: 最新文章
newer: Newer
older: Older
share: Share
powered_by: Powered by
rss_feed: RSS Feed
category: Category
tag: Tag

修改字體

Next 主題內建使用微軟雅黑體,但根據請不要用微軟雅黑體來顯示台灣區的繁體字這篇的經驗,台灣區改用微軟正黑體比較正確,

themes/landscape/source/css/_variables.styl 的 font-sans 加上 "微軟正黑體"

themes/landscape/source/css/_variables.styl
1
2
3
4
5
6
7
8
9
// Fonts
-font-sans = -apple-system, BlinkMacSystemFont,
- "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
- "Fira Sans", "Droid Sans", "Helvetica Neue",
- sans-serif
+font-sans = -apple-system, BlinkMacSystemFont, "Noto Sans TC", "微軟正黑體",
+ "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
+ "Fira Sans", "Droid Sans", "Helvetica Neue",
+ sans-serif

當使用者的作業系統沒有第一個字體的時候,就會依照順位來找尋第二個字體…以此類推,所以這些擺放位置不是隨意擺放的,要有優先順序的放,通常會將英文字體在最前面順位、接著是MAC字體、Windows字體,原因是中文字體通常有包含英文字體,所以中文字體放前面的話,英文字就會優先採用中文字體,不會往後找你設定的英文字體了

Segoe:是一款西文無襯線體,是由微軟公司開發的並且廣泛使用的字型
Roboto:2011年後,隨著 Android 4.0 的發布,Android 預設字體改成 Roboto 系列
Droid:2011年前都是Android系統的標準字體
Helvetica:是一種廣泛使用於拉丁字母的無襯線字體
Noto Sans TC:黑體字體–思源黑體(繁體中文)
Microsoft JhengHei:微軟正黑體
Microsoft YaHei:微軟雅黑體

修改字體大小

themes/landscape/source/css/_variables.styl
1
2
-font-size = 14px
+font-size = 16px

調整側邊欄顯示的 widget

Hexo 預設的 landscape 主題的側邊欄有「分類」、「標籤」、「標籤雲」、「封存文章」、「最新文章」這幾個,要關閉某一個 widget 的話需要到 theme/_config 裡的 widgets 做調整

像這樣就是關閉標籤雲,

themes/landscape/_config.yml
1
2
3
4
5
6
7
8
# Sidebar
sidebar: right
widgets:
- category
- tag
# - tagcloud
- archive
- recent_posts

側邊欄調整最新文章的顯示數量

在以前舊版的 landscape 預設是顯示5個,直到後來才有人把這參數獨立出來放在主題的 _config.yml 下給人調整,

以舊版為例,直接去 themes/landscape/layout/_widget/recent_posts.ejs 路徑把最新文章增加到10

themes/landscape/layout/_widget/recent_posts.ejs
1
2
-        <% site.posts.sort('date', -1).limit(5).each(function(post){ %>
+ <% site.posts.sort('date', -1).limit(10).each(function(post){ %>

以新版為例,直接在修改主題的 _config.yml 裡調整就好

themes/landscape/_config.yml
1
2
3
show_count: false
-recent_posts_limits: 5
+recent_posts_limits: 10

新增 about 頁面

輸入下列指令新增 about 頁面,會產生 source/about/index.md

1
hexo new page about

這時預覽可以發現會產生新的頁面在 xxx/about/
因此類推,你輸入 hexo new page “hello” 會產生 source/hello/index.md 然後會有新頁面出現在 xxx/hello/
跟新增文章的指令不同唷,新增文章是 hexo new post “hello” 產生 source/_posts/hello.md,別搞混了~~~

新增標籤 tags 頁面

輸入下列指令新增標籤頁面,會產生 source/tags/index.md

1
hexo new page tags

index.md 的 layout 修改成 tags,預設不填 layout 帶入 page 這個參數,

index.md
1
2
3
4
5
6
---
title: tags
date: 2021-01-31 22:00:00
layout: tags
comments: false
---

原本的 layout: page 會在 layout.ejs 的 <%- body %> 套入 article.ejs,
改成 layout: tags 後就會在 layout.ejs 的 <%- body %> 套入 tags.ejs,所以我們要來新增 tags.ejs 自訂我們的顯示方式,tags.ejs 內容如下,

tags.ejs
1
2
3
4
5
6
7
8
9
10
11
12
<article id="post" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 class="article-title" itemprop="name"><%= __('tags') %></h1>
</header>
<div class="article-entry" itemprop="articleBody">
<% if (site.tags.length){ %>
<%- list_tags({show_count: theme.show_count}) %>
<% } %>
</div>
</div>
</article>

其它相關文章推薦
Hexo 使用 Google Analytics 進行網站流量分析
Hexo 本機測試時如何關閉 Google Analytics
Hexo codeblock 插入程式碼區塊與各種程式語言預覽
升級更新 Hexo upgrade
Ubuntu 安裝 Hexo
Mac OS 安裝 Hexo