1. 程式人生 > >C語言關鍵字淺析-char

C語言關鍵字淺析-char

### 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第五版》