C語言關鍵字淺析-char
阿新 • • 發佈:2018-11-23
### C語言關鍵字淺析系列 ###
### ISO/ANSI C 關鍵字 ###
字元型別(character)是C語言的幾個基本資料型別之一
同時char關鍵字也算是很常見的
比如程式中常見的:(這也是char變數的定義和初始化格式)
char c = 't'; // 定義一個字元變數
char a[10] = "Hello"; // 定義一個字元陣列
char的作用是:
定義字元型基本資料型別的變數。
1、char變數的技術實現
說到char型別就不得不提到標準ASCII碼,因為從技術實現上看,char字元是由整數解析過來的
所以有些時候可以見到對字元變數進行整型變數類似的處理
/*
將字元型別的數字0-9轉化為數值
*/
int getValue(char n)
{
/*
由於char可看作整數,且ASCII碼中的0-9字元是有序的,
所以可以認為編碼小於0或者大於9的不是數字,報錯
*/
if(n < '0' || n > '9')
return -1;
/*
如果是0-9的字元,按照一次等比線性函式關係,
把字元編碼與0字元的編碼相減即得到字元的值
*/
else
return n - '0';
}
當然下面這種直接用數值定義字元變數的做法也是對的,不過不提倡:
char c = 70; /* 直接用數值編碼定義賦值,對ASCII的系統可以,但其他系統中可能出錯 */ char s = 'D'; /* 這樣的定義方式更直觀,也可以在任意系統中正常工作 */
char變數在printf函式中的說明符是%c,不過因為它本質上是整數表示的,也可以用%d表示:
char x = 'A';
printf("Value of %c is %d", x, x); /* Value of A is 65 */
2、轉義字元
雖然char字元是表示各種字元符號的,但ASCII中有些字元是不能打印出來的,或者說是一種操作指令,
以及有些字元如果在程式中直接編寫可能導致語義衝突(比如引號)
這時候就需要了解一下轉義字元了,其常見於字元陣列中
/* 輸出語句需要引號時需要用'\"'這樣的轉義字元,否則可能出現語法錯誤 這裡用到了引號(\")和回車(\n)的轉義字元 */ printf("We need a \"YES\"\n"); /* \t是水平製表符,和Tab鍵類似 */ for(i = 0;i < 3;i++) { printf("%d\t%d\t%d\n", a[i], b[i], c[i]); } /* 反斜槓自身也需要反斜槓來加以標註,常用於檔案路徑的表示 */ openFile("H:\\mySoftware\\test.c");
3、char陣列
這是個很大的話題,但char陣列無疑是很實用和常用的強大字串處理工具
char陣列中還是有很多驚豔的語法形式的
比如ANSI C中支援這樣的定義初始化:
/* 他們都是等價的結果 */
char a[30] = "I wanna more hair."; /* 簡練的賦值 */
char b[30] = "I" "wanna" "more" "hair."; /* 驚豔的賦值 */
char c[30]; /* 魔鬼般的賦值 */
c[0] = 'I';c[1] = ' ';
c[2] = 'w';c[3] = 'a';c[4] = 'n';c[5] = 'n';c[6] = 'a';c[7] = ' ';
c[8] = 'm';c[9] = 'o';c[10] = 'r';c[11] = 'e';c[12] = ' ';
c[13] = 'h';c[14] = 'a';c[15] = 'i';c[16] = 'r';c[17] = '.';c[18] = '\0';
/*
注意第二個賦值方式,字串文字中間沒有間隔或者有空格,ANSI C會自動連起來
第三個賦值的末尾的\0叫做結束識別符號,通常編譯器會自行補全
比如當前長度為30的c陣列,只有前18位元素有字元,則後面的位置會被\0補全
*/
很多時候我們其實並不清楚我們需要操作的字串長度為多少,不妨把長度計算的工作交給編譯器去決定,
慶幸的是C的編譯器願意分擔這項工作:
/* 管他陣列多長呢 */
char c[] = "Messi Neymar Suarez Xavi Iniesta Busquets Alba Pique Maschenaro Alves";
既然char陣列本身是陣列,那很多陣列上的指標的用法在這裡也是行得通的
char barcaForward[10] = "Messi";
printf("%s\n%c", barcaForward, *barcaForward);
/*
結果是:
Messi
M
%s是輸出字元陣列的說明符,會從字元陣列的第一個元素開始輸出字串
*barcaForward是得到指向的地址中的值,應該是陣列的第一個字元
即M
*/
——參考《C Primer Plus第五版》