C 語言字串 | ASCII 表應用 | Command Line Argument

更新於 發佈於 閱讀時間約 1 分鐘
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,我們將解析 Command Line Argument(命令列引數)的使用方法,並探討程式結束時的 Exit Status(退出狀態)。讓我們一起揭開這些概念的神秘面紗,往電腦科學靠近!

字串與陣列

「HI! 」在 C 語言中其實是以字元陣列的方式被儲存,每一個字母在 C 語言的資料型別是 char

#include <stdio.h>

int main(void)
{
char c1 = 'H';
char c2 = 'I';
char c3 = '!';
printf("%c%c%c\n", c1, c2, c3);
}

成功輸出 HI! 但如果改成以整數輸出,會有什麼結果呢?

#include <stdio.h>

int main(void)
{
char c1 = 'H';
char c2 = 'I';
char c3 = '!';
printf("%i%i%i\n", c1, c2, c3);//改成輸出int資料型別
}
輸出727333

輸出727333

這些 727333 是對照 ASCII Table 所產生的對應數字,之後再轉成 0 和 1 的方式存在電腦。

圖片來源:https://www.geeksforgeeks.org/ascii-table/

圖片來源:https://www.geeksforgeeks.org/ascii-table/

實際上不須要一個一個給字母資料型態,在 CS50 的環境中,加入 <cs50.h> 就會有string 表示字串。這個資料型別背後的原理是「陣列」,陣列是連續的資料儲存格式,就跟實際上的字串寫法一樣。以下示範用字元陣列的概念輸出字串,方便你了解儲存方式,但平常只需要打 %s 就可以輸出字串了。

#include <stdio.h>
#include <cs50.h>

int main(void)
{
string s = "HI!";
printf("%c%c%c\n", s[0],s[1],s[2]);
}

如果改成整數,並多顯示一格會發生什麼事呢?

#include <stdio.h>
#include <cs50.h>

int main(void)
{
string s = "HI!";
printf("%i%i%i%i\n", s[0],s[1],s[2],s[3]);
}
居然在最後出現0

居然在最後出現0

在 ASCII Table 中,輸出 0 代表 NULL 空值,這裡沒有值的意思,並不是使用者輸入 0 這個數字。補充說明,字元陣列的結束會用 NUL 代表字串結束,在電腦中會用 \0 多留一個空間,不過使用者並不會看到。

一張圖說明 0 和 NULL 的差別。0 是沒有衛生紙,但 NULL 是連紙捲都沒有。圖片來源:網路。

一張圖說明 0 和 NULL 的差別。0 是沒有衛生紙,但 NULL 是連紙捲都沒有。圖片來源:網路。








raw-image


既然字串是以陣列的形式表示,也可以用陣列的方式計算字串的長度。背後的概念是讀陣列的索引值,如果讀到\0 就代表已經結束。

#include <cs50.h>
#include <stdio.h>

int string_length(string s);
int main(void)
{
string name = get_string("Name: ");
int length = string_length(name);
printf("%i\n", length);
}

int string_length(string s) // 寫一個長度的功能餵字串進去
{
int n = 0;
while (s[n] != '\0')
{
n++;
}
return n;
}

不過,C 語言裡有已經寫好的標頭檔,加入 <string.h>,可以直接使用 strlen 即可,不需要再寫迴圈一個一個讀值。

密碼學入門:凱薩密碼

綜合前面提到的 ASCII 表與陣列的概念,我們來實作凱薩密碼。凱薩密碼是經典的加密方法,由 Julius Caesar 提出,雖然現今這種方法很容易被破解,但仍是密碼學的入門經典題型。凱薩密碼主要概念是讓英文字母往後位移特定的數值,例如:

位移量 3,加密訊息為 "HELLO":

  • H -> K
  • E -> H
  • L -> O
  • L -> O
  • O -> R

因此,"HELLO" 經過凱薩密碼加密後就會變成 "KHOOR"。

#include <cs50.h>
#include <ctype.h> //注意有<ctype.h>,後面的islower從這裡來
#include <stdio.h>
#include <string.h>

int main()
{
string s = get_string("input: ");
int move = get_int("偏移值: ");
for (int i = 0, n = strlen(s); i < n; i++)
{
if (islower(s[i]))//判斷小寫
{
printf("%c", (s[i] + move - 'a') % 26 + 'a');
}
else
{
printf("%c", (s[i] + move - 'A') % 26 + 'A');
}
}
}

在 C 語言,可以使用 <ctype.h> 的函式庫,就有判斷小寫的函數。

英文大小寫轉換 (uppercase)

這裡也是要應用 ASCII 表的值,注意大小寫都固定相差 32 ,所以我可以利用這個特性,把所有的小寫變成大寫。

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
string s = get_string("Before: ");
printf("After: ");
for (int i = 0, n = strlen(s); i < n; i++)//起始值i與終點值n
{
if (s[i] >= 'a' && s[i] <= 'z') //
{
printf("%c", s[i] - 32);//每個字元都差32,用('a'-'A')也可以
}
else
{
printf("%c", s[i]);
}
}
printf("\n");
}

Multi-dimensional Array (多維陣列)

當字串本身就是一個陣列,而你想把多個字串組成一個陣列時,就會形成「大陣列包小陣列」的結構。

#include <stdio.h>
#include <cs50.h>

int main()
{
string words[2];

words[0]="HI!";
words[1]="BYE!";

printf("%c%c%c\n",words[0][0],words[0][1],words[0][2]);
printf("%s\n", words[1]);
}
  • words[0][0] 代表,陣列 words[0]HI!」的第 0 個字母 H 。

由此可知,陣列可以是多維陣列(Multi-dimensional Array),多維陣列通常用來表示像是表格、圖像或矩陣等資料結構。

#include <stdio.h>

int main()
{
// 定義一個 3x3 的二維陣列
int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

// 輸出陣列的所有元素
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", array[i][j]);
}
printf("\n"); // 換行,讓輸出看起來像一個表格
}
}

在這個例子中,array 是一個二維陣列,它包含三個子陣列,每個子陣列裡面有三個元素。我們可以用兩個索引來存取每個元素。例如:

  • array[0][0] 會得到 1(第 0 列第 0 行),0 是索引值,陣列的起點。
  • array[1][2] 會得到 6(第 1 列第 2 行)

Command Line Argument(命令列引數)

Command Line Argument(命令列引數),其實就是指你在終端機或命令列中執行一個程式時,可以額外輸入的值或訊息,這些值會被餵給程式,幫助程式運作。

以前我們要執行打招呼的程式,需要再請使用者輸入名字,才可以打招呼。

raw-image

使用者可以直接在下指令時,輸入「bicky」 ,就會跑出「 hello, bicky」。原因是我已經預留一個陣列空間,表示程式運行時就要被餵入一個值。

raw-image

但我如果輸入 bicky yang 只會跑出 bicky,因為我指定輸出 argv[1] 也就是第一個引數。

raw-image

argc 是什麼?

  • argc 是一個整數,代表命令列引數的數量(arguments count),也就是當你執行這個程式時,總共傳入了幾個引數。
  • argc 的值至少會是 1,因為它會包含程式本身的名稱作為第一個引數。

argv[] 是什麼?

  • argv[] 是一個字串陣列(array of strings),它儲存了所有的命令列引數。每個引數都是以字串形式儲存的。
  • argv[0] 通常是執行的程式名稱,在這個程式 argv[0] ​表示 ./greetargv[1]argv[2] 等則是依次代表你在命令列中輸入的其他引數。

來點有趣的,如果你直接打 cowsay 加某個詞,就會出現一隻牛說出你輸入的詞。

raw-image

Exit status 退出狀態

一般沒有問題的程式,程式碼會 return 0 表示成功,只是使用者在終端機看不到,如果顯示 return 其他數字就表示程式出現錯誤。return 其他數字可由軟體開發工程師自行定義,每個數字表示異常的代表。例如,工程師可以設定如果 return 127 表示command not found 。在 C 語言 的環境中,可以輸入 echo $? 查上一個命令的狀態。

顯示 127 找不到此命令

顯示 127 找不到此命令


不過,網頁常出現的 404 not found 是 HTTP status,用以表示網頁伺服器超文字傳輸協定回應狀態的 3 位數字代碼,全世界統一,不能由工程師自行更改。

留言
avatar-img
留言分享你的想法!
avatar-img
越南放大鏡 X 下班資工系
14會員
61內容數
雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
Thumbnail
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
Thumbnail
Basic python data structure
Thumbnail
Basic python data structure
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
在C#程式設計中,處理字串操作是一個常見的任務。有時候,我們可能需要去除字串中不需要的空格,特別是在處理使用者輸入、讀取檔案或處理資料庫查詢結果時。在這篇教學中,我們將學習如何使用C#內建的方法來去除字串頭尾的空格。
Thumbnail
在C#程式設計中,處理字串操作是一個常見的任務。有時候,我們可能需要去除字串中不需要的空格,特別是在處理使用者輸入、讀取檔案或處理資料庫查詢結果時。在這篇教學中,我們將學習如何使用C#內建的方法來去除字串頭尾的空格。
Thumbnail
Hi, 大家好。我是茶桁。 前几节课中我们学习了函数,那么这节课开始,我们花几节课返过头来详细的学习一下Python内的数据类型。第一节课,让我们先从字符串开始: 回顾字符串的定义方式 了解转义字符 字符串格式化的方法 字符串相关函数 字符串的定义方式 单引号定义字符串 ‘ ’ 双引
Thumbnail
Hi, 大家好。我是茶桁。 前几节课中我们学习了函数,那么这节课开始,我们花几节课返过头来详细的学习一下Python内的数据类型。第一节课,让我们先从字符串开始: 回顾字符串的定义方式 了解转义字符 字符串格式化的方法 字符串相关函数 字符串的定义方式 单引号定义字符串 ‘ ’ 双引
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News