1. 程式人生 > >5. C語言 -- 字元和字串

5. C語言 -- 字元和字串

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。・∀・)ノ゙

1. 字元型別

  回顧上篇博文《4. C語言 – 資料型別和取值範圍》中的 “2.3 基本資料型別的取值範圍” 部分,可以知道字元型別事實上是一個特殊的整型,因此它也有取值範圍,signed char 的取值範圍是 -128 ~ 127;unsigned char 的取值範圍是 0 ~ 255。

1.1 ASCII 碼

  存放在字元型別中的變數,都可以被解釋為 ASCII 字元表中的對應字元。標準 ASCII 字元表使用7位二進位制數來表示所有的大寫和小寫字母,數字 0 到 9、標點符號, 以及在美式英語中使用的特殊控制字元。其中,ASCII 字元表上的數字 0 ~ 31 以及 127(共 33 個)分配給了控制字元,用於控制像印表機等一些外圍裝置。這些是看不到的。數字 32 ~ 126 分配給了能在鍵盤上找到的字元,這些是所見即所得的。

  比如執行下面的程式碼

#include <stdio.h>

int main()
{
	char a = 'C';
	printf("%c = %d\n", a, a);
	return 0;
}

將得到如下的輸出結果

C = 67

其中字元 a 以 “C” 的形式輸出是沒有問題的,後面的 67 實際輸出的就是字元 a 的 ASCII 碼。當然我們也可以給字元型的變數賦值一個正整數(ASCII 碼),其同樣可以以字元型的形式輸出,如下

#include <stdio.h>

int main()
{
	char a = 70, b = 105, c = 115, d = 104, e = 67;
	printf("%c%c%c%c%c\n", a, b, c, d, e);
	return 0;
}

將得到如下的輸出結果

FishC

1.2 字元型的符號位

  但是字元型別與普通整數型別又存在著不同之處。C 標準規定普通整數型別預設使用 signed 修飾符,但沒有規定 char 的預設修飾符。因此,使用 signed 或 unsigned 修飾符,是由編譯系統自行決定。

  如下面的程式碼所示

#include <stdio.h>

int main()
{
	char height;
	height = 170;
	printf("身高是%d釐米!\n", height);
	return 0;
}

將得到如下的輸出結果

身高是-86釐米!

這裡的原因就是字元型的signed 或 unsigned 修飾符是由編譯系統自行決定,在 Ubuntu16.04 中使用 gcc 進行編譯執行的時候預設字元型是有符號的。因為 170 的二進位制表達為 10101010,但是此時的二進位制表達對應著是一個負數(首位的符號位為 1),這時 printf 輸出的補碼 10101010 所對應的數字,我們保持符號位不變,首先將 0101010 - 1 ,得 0101001,然後再按位取反得 10101101010110對應的十進位制數字為86,所以11010110對應的數字就是 -86。

  解決這一類問題比較好的方法就是將程式碼中的 char height; 改為 unsigned char height; ,通過指定是否為有符號數來解決這個問題。

2. 字串型別

  字串實際上是由一些字元組成的,比如說 “Hello World” 是由下面的字元組成的。 在這裡插入圖片描述 最後面的 '\0' 表示一個字元出的結束,因為在讀入字串的過程中,機器需要知道他從哪裡讀到哪裡,這個時候就需要 '\0' 表示一個字元出的結束。

  定義字串有以下2種方式:

// 給出字串中字元的個數以及每個字元分別是什麼
char a[6] = {'a','p','p','l','e','\0'};

// 直接使用字串進行命名,不用指定字串中字元的個數,不用在結尾加入 '\0',不用 {}
char b[] = "apple"

其中對於字串的定義利用了一些陣列的知識,這部分知識將在後面的部落格中進行介紹。

2.1 舉例說明

  下面的程式使用了上面的兩種方式分別建立了兩個字串

#include <stdio.h>

int main()
{
        char a[6] = {'a','p','p','l','e','\0'};
        char b[] = "apple";
        printf("%s\n", a);
        printf("%s\n", b);
        printf("a[0] is %c and a[5] is%cspace\n", a[0], a[5]);
        printf("b[0] is %c and b[5] is%cspace\n", b[0], b[5]);
        return 0;
}

除此之外還列印輸出了字串中的位與首位和末尾的字元,實驗結果如下圖所示

  通過上面的實驗我們可以看出通過兩種方式建立的字串是一樣的;雖然我們看見的字串的 “長度” 是 5,但實際上字串的長度是 6,末尾是 \0 並不會輸出什麼(如實驗結果中 “is” 與 “space” 之間相連,所以 \0 什麼都不會輸出,當然也不會是空格之類的)。

參考

歡迎大家關注我經常投稿的微信公眾號 在這裡插入圖片描述