第4章 字符串和格式化输入/输出
學習筆記——《C Primer Plus》
第4章 字符串和格式化輸入/輸出
- 4.1 前導程序
- 4.2 字符串簡介
- 4.2.1 char 類型數組和 null 字符
- 4.2.2 使用字符串
- 4.2.3 strlen() 函數
- 4.3 常量和 C 預處理器
- 4.3.1 符號常量
- 1. 使用**符號常量**的好處:
- 2. 創建符號常量
- 4.3.2 const 限定符
- 4.3.3 轉換說明的意義
- 4.4 printf() 和 scanf()
- 4.4.1 printf() 函數
- 4.4.2 scanf() 函數
- 4.4.3 printf() 和 scanf() 的 * 修飾符
4.1 前導程序
#include <stdio.h> #include <string.h> //提供 strlen() 函數的原型 #define DENSITY 62.4 //人體密度(單位:磅/立方英尺int main(void) {float weight, volume;int size, letters;char name[40]; // name 是一個可容納40個字符的數組printf("Hi! What's your first name?\n"); scanf("%s",name);printf("%s,what's your weight in pounds?\n",name);scanf("%f", &weight);size = sizeof name;letters = strlen(name);volume = weight / DENSITY;printf("Well, %s, your volume is %.2f cubic feet\n", name, volume);printf("Also, your first name has %d letters,\n", letters);printf("and, we have %d bytes to store it.\n", size);return 0;}運行結果:
- 用數組(array)儲存字符創(character string)。在該程序中,用戶輸入的名被儲存在數組中,該數組占內存中40個連續的字節,每個字節儲存一個字符值。
- 使用 %s 轉換說明來處理字符串的輸入和輸出。注意,在 scanf() 中,name 沒有前綴,而 weight 有,因為用 scanf() 把字符串讀入字符數組中,不用 &。
- 用 C 預處理器把字符常量 DENSITY 定義為 62.4。
- 用 C 函數 strlen() 獲取字符串的長度。
4.2 字符串簡介
字符串(character string)是一個或多個字符的序列,如下所示:
char = ch; ch = “Zing went the strings of my heart!”;雙引號不是字符串的一部分。
雙引號僅告知編譯器它括起來的是字符串,正如單引號用于標識單個字符一樣。
4.2.1 char 類型數組和 null 字符
C 語言沒有專門用于儲存字符串的變量類型,字符串都被儲存在 char 類型的數組中。
數組由連續的存儲單元組成,字符串中的字符被儲存在相鄰的存儲單元中,每個單元儲存一個字符。
注意:
圖中數組末尾位置的字符 \0 。這是空字符(null character),C語言用它標記字符串的結束。
C 中的字符串一定以空字符結束,這意味著數組的容量必須至少比待存儲字符串中的字符數多 1。
數組:
同類數據元素的有序序列。
如前導程序中,通過以下聲明創建了一個包含40個存儲單元(或元素)的數組,每個單元儲存一個 char 類型的值:
name 后面的方括號表明這是一個數組,方括號中的 40 表明該數組中的元素數量。char 表明每個元素的類型。
4.2.2 使用字符串
#include <stdio.h> #define PRAISE "You are a extraordinary being!"int main(void) {char name[40];scanf("%s", name);printf("Hello, %s , %s\n",name, PRAISE);return 0; }%s 告訴 printf() 打印一個字符串。 %s 出現兩次,因為程序要打印兩個字符串:一個儲存在 name 數組中;一個由 PRAISE 來表示。
不用親自把空字符放入字符串末尾,scanf() 在讀取輸入時就已經完成這項工作。
輸出結果:
注意:
scanf() 在遇到第一個空白(空格、制表符或換行符)時就不再讀取輸入。因為,根據轉義字符 %s ,scanf() 只會讀取字符串中的第一個單詞。
字符和字符串
字符常量 ‘x’ 和字符串常量 “x” 不同;
區別一是 ‘x’ 是基本類型(char),而 “x” 是派生類型(char 數組);
區別二是 “x” 實際上由兩個字符組成:‘x’ 和空字符 \0。
4.2.3 strlen() 函數
sizeof 運算符
- 是以字節為單位給出對象的大小;
- 它會把字符串末尾不可見的空字符也計算在內;
- 運算對象是類型時,必須加圓括號,如:sizeof(int);
- 運算對象是特定值,圓括號可有可無,建議所有情況都加上圓括號。
- 用轉義說明 %zd 。
strlen() 函數
- 給出字符串中的字符長度,也就是字符串中的字符數(包括空格和標點符號)。
- 用轉義說明 %zd 。
4.3 常量和 C 預處理器
有時,在程序中要使用常量。
例如,計算圓周長:
但,使用 符號常量 (symbolic constant) 會更好,計算機會給出實際值完成替換:
circumference = pi * diameter;4.3.1 符號常量
1. 使用符號常量的好處:
- 常量比數字表達的信息更多。
- 更改起來更加方便,如果程序使用符號常量,只需更改符號常量的定義;無序逐一修改。
2. 創建符號常量
法一:
float taxrate; taxrate = 0.015;這樣做提供一個符號名,但 taxrate 是一個變量,程序可能會無意間改變它的值。
法二:C 預處理器
/*格式: #define NAME value 沒有 = 和 ; 全大寫表示符號常量是C語言的一貫傳統, 這樣在程序中看到全大寫就立刻明白是個符號常量,而非變量。 */ #define TAXTATE 0.15小練習:
#include <stdio.h> #define PI 3.14259 int main(void) {float area, circum, radius;printf("What's the radius of your pizza?\n");scanf("%f", &radius);area = PI * radius * radius;circum = PI * radius * 2.0;printf("Your basic pizza parameters are as follows:\n");printf("circumference: %1.2f, area: %1.2f.\n", circum , area);return 0; }printf() 語句中 %1.2f 表明,結果被四舍五入為兩位小數輸出。
#define 指令還可以定義字符和字符串常量,前者用單引號,后者用雙引號。
#define BEEP '\a' #define TEE 'T' #define ESC '\033' #define OOPS "Now you have done it!"4.3.2 const 限定符
C90 標準新增了 const 關鍵字,用于限定一個變量為只讀。其聲明如下:
const int MONTHS = 12; //MONTHS在程序中不可更改,值為12MONTHS 成為一個只讀值。也就是說,可以在計算中使用MONTHS,可以打印MONTHS,但是不能更改MONTHS的值。
const 用起來比 #define 更加靈活。
4.3.3 轉換說明的意義
轉換說明把二進制格式儲存在計算機中的值轉換成一系列字符(字符串)以便顯示。
4.4 printf() 和 scanf()
4.4.1 printf() 函數
printf() 函數把整數、浮點數、字符和字符串轉換成顯示在屏幕上的文本;
由于 printf() 函數使用 % 符號來標識轉換說明, 如果要打印一個 % 符號,就使用兩個 % 符號。
當 printf() 語句太長,可給語句分行,但是不能在雙引號括起來的字符串中斷行。
4.4.2 scanf() 函數
scanf() 函數把輸入的字符串轉換成整數、浮點數、字符或字符串。
printf() 函數使用變量、常量和表達式,而 scanf() 函數使用指向變量地址的指針。
- 如果用 scanf() 讀取基本變量類型的值,在變量名前加上一個&
- 如果用 scanf() 把字符串讀入字符數組中,不使用&。
輸出結果:
scanf() 函數使用空白(換行符、制表符和空格)把輸入分為多個字段。在依次把轉換說明和字段匹配時跳過空白。
注意 %c 轉換說明,根據 %c ,scanf() 會讀取每個字符,包括空白。
格式字符串中的普通字符
scanf() 函數允許把普通字符放在格式字符串。除空格字符外的普通字符必須與輸入字符串嚴格匹配。如在兩個轉換說明中添加一個逗號:
scanf() 函數將其解釋成:用戶將輸入一個數字、一個逗號,然后再輸入一個數字。
注意:
除了 %c ,其他轉換說明都會自動跳過待輸入值前面所有的空白。
對于 %c,如果在格式字符串中把空格放到 %c 的前面,scanf() 便會跳過空格,從第1個非空白字符開始讀取。
4.4.3 printf() 和 scanf() 的 * 修飾符
printf() 函數的 * 修飾符:
如果你不想預先指定字段寬度,希望通過程序來指定,那么可以用 * 修飾符代替字段寬度。
但還是要用一個參數告訴函數,字段寬度應該是多少。
如果轉換說明是 %*d ,那么參數列表中應包含 * 和 d 對應的值。
總結
以上是生活随笔為你收集整理的第4章 字符串和格式化输入/输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unit Three-Program t
- 下一篇: 第6章 C控制语句:循环