一、字符串
C 語言中並沒有專門用於儲存字符串的變量類型,字符串都被存儲在char類型的數組中。在數組中,會存在一個空字符(null character)【一個非打印字符,其 ASCII 碼值是(或等價於)0】,C語言用其來標記字符串的結束。也就是說,char 型數組的容量必須比待存儲字符串中的字符數多1。
strlen() 函數,對於計算字符串的長度,遇見空字符則停止計算,且空字符並不計算在內。與 sizeof 運算符有一定的區別。
二、printf ()
1 - 轉換說明及其打印的輸出結果
轉換說明及其打印的輸出結果
2 - 轉換說明修飾符
printf() 修飾符 - 1
printf() 修飾符 - 2
printf() 標記
3 - 返回值
返回打印字符的個數。如果有輸出錯誤,printf() 會返回一個負值(舊版本的不同,具體負值可能不同)。
4 - 打印較長的字符串的幾種形式
方法一:使用多個 printf() 語句完成信息的輸出。
示例:printf("Here id a way to print a ");
printf("long string. \n ");
方法二:用 ' \ ' 和 Enter (Return) 組合來斷行。【下一行代碼必須和程序清單中的代碼一樣從左邊開始】
示例:printf("Here id a way to print a \
long string. \n");
方法三:ANSI C 引入的字符串連接,在兩個用雙引號括起來的字符串之間用空白隔開,C 編譯器會把多個字符串看作是一個字符串。
示例:printf("Here id a way to print a " “long string. \n”);
三、scanf()
1 - 轉換說明
ANSI C 中 scanf() 的轉換說明
2 - 修飾符
scanf() 修飾符 - 1
scanf() 修飾符 - 2
3 - 返回值
scanf() 函數返回成功讀取的項數。
如果沒有讀取任何項,且需要讀取一個數字而用戶缺輸入一個非數值字符串,返回0。
當sacnf() 檢測到 “文件結尾” 時,返回 EOF(EOF 是 stdio.h 中定義的特殊值)。
4 - 輸入具體過程
如果使用的是 %d 轉換說明,scanf() 每次讀取一個字符時,跳過所有的空白字符,直至遇到第一個非空白字符(一個數字字符或者 + / - )才開始讀取並保存,之后依次讀取數字字符,直到遇到非數字字符,便認為讀到了整數的末尾。此時,scanf() 把非數字字符放回輸入,這也就意味着長須在下一次讀取輸入時,首先讀取到的是上一次讀取丟棄的非數字字符。最后,sacnf() 函數計算已讀取數字(可能該有符號)相應的數值,並將計算后的值放入指定的變量中。
如果使用字段寬度,scanf() 會在字段結尾或第1個空白字符處停止讀取(滿足二者條件之一便可)。
其他轉換說明,大多數與 %d 類似。
如果使用 %s 轉換說明,scanf() 會讀取除空白以外的所有字符。scanf() 跳過空白開始讀取第1個非空白字符,並保存非空白字符直到再次遇到空白。也就意味着 scanf() 讀取一個單詞,其中不包括空白字符,當其將單詞保存至具體的數組的時候,會自動再起末尾加上 '\0'。同樣,如果是使用了字段寬度,與 %d 類似。
除了 %c ,其他轉換說明都會自動跳過輸入值前面所有的空白。
四、printf() 和 scanf() 中的 * 修飾符
1 - printf()
如果不想預先指定字段寬度,希望跳過程序指定,可以用 * 修飾符代替字段寬度,但是之后還是要在必要的地方提供一個字段寬度參數。也就是說,如果轉換說明是 %*d ,那么參數列表中就一定要包含 * 和 d 的值。
2 - scanf()
把 * 放在 % 和轉換字符之間時,會使得 scanf() 跳過相應的輸入項。
[示例]
int n;
scanf("%*d %*d %*d", &n);
[輸入: 2013 2014 2015]
[結果:n == 2015]
五、其他
1 - getchar() 與 putchar()
getchar()、putchar() 兩個函數均只針對字符型數據。因為兩者只處理字符,所以並不需要相應的轉換說明。【這兩個函數通常定義在 stdio.h 頭文件中,而且,它們通常是預處理宏,而不是真正的函數。】