第四章 字符串和格式化輸入輸出
-
使用字符數(shù)組(array)儲(chǔ)存字符串
// 示例程序
#include <stdio.h>
#include <string.h> //提供strlen()函數(shù)的原型
int main() {
char name[50];
printf("輸入名字\n");
scanf("%s", name);
printf("你的名字是:%s\n", name);
//sizeof查看容量
int size = sizeof name;
printf("數(shù)組容量size:%d\n", size);
//string.h中的strlen()函數(shù),查看字符串長(zhǎng)度
printf("字符串長(zhǎng)度為%ld\n", strlen(name));
}
- 用字符數(shù)組(array)儲(chǔ)存字符串旺隙,該數(shù)組在內(nèi)存中占用連續(xù)的50個(gè)字節(jié)捌蚊,每個(gè)字節(jié)存儲(chǔ)一個(gè)字符舀瓢。
- 使用 %s 做為輸入輸出的占位符债蓝,注意奏纪,在scanf中鉴嗤,name變量沒有&前綴,而數(shù)字類型的變量有序调。
- 使用 string.h 中的 strlen() 函數(shù)獲取字符串長(zhǎng)度醉锅。
// 運(yùn)行結(jié)果
輸入名字
sunjian
你的名字是:sunjian
數(shù)組容量size:50
字符串長(zhǎng)度為7
-
字符串簡(jiǎn)介
C語言沒有專門用于儲(chǔ)存字符串的變量類型,字符串都被儲(chǔ)存在char類
型的數(shù)組中发绢。數(shù)組由連續(xù)的存儲(chǔ)單元組成硬耍,字符串中的字符被儲(chǔ)存在相鄰的
存儲(chǔ)單元中,每個(gè)單元儲(chǔ)存一個(gè)字符边酒。
? 注意字符串最后一位的 \0 默垄,這是C語言標(biāo)記字符串的結(jié)束,占用一個(gè)單元甚纲,所以長(zhǎng)度為50的數(shù)組只能存儲(chǔ)49個(gè)字符口锭。數(shù)組的容量至少要比待存儲(chǔ)的字符數(shù)多 1 位。
? scanf在讀取字符串時(shí)介杆,遇到空白符(空格鹃操,制表符或換行符)就不再繼續(xù)讀取輸入,例如輸入Cris Paul, scanf("%s",name) 只會(huì)讀取到Cris春哨。C語言還有其他的輸入函數(shù)可以讀取字符串荆隘,后面會(huì)學(xué)習(xí)到。
? 注意定義字符和字符串的區(qū)別赴背,字符是基本類型(char),字符串是派生類型(char 數(shù)組)椰拒,區(qū)別如圖。
? sizeof() 函數(shù)返回的是該數(shù)組有多少個(gè)存儲(chǔ)單元凰荚,strlen() 返回的是字符串的長(zhǎng)度(不包含結(jié)束符 \0)燃观。strlen() 知道在何處停止。
圓括號(hào)的使用時(shí)機(jī)否取決于運(yùn)算對(duì)象是類型還是特定量便瑟?運(yùn)算對(duì)象是類型時(shí)缆毁,圓括號(hào)必不可少,但是對(duì)于特定量到涂,可有可無脊框。也就是說,對(duì)于類型践啄,應(yīng)寫成sizeof(char)或sizeof(float)浇雹;對(duì)于特定量,可寫成sizeof name或sizeof 6.28屿讽。盡管如此昭灵,還是建議所有情況下都使用圓括號(hào),如sizeof(6.28)。
-
const 限定符
const限定符用于限定一個(gè)變量為只讀(是只讀變量虎锚,不是常量)硫痰,const 用起來比 #define更加靈活。
const int MONTHS = 12; // MONTHS在程序中不可更改窜护,值為12
- 明示常量
引入頭文件<limits .h> ,輸出INT_MAX和INT_MIN效斑,可以查看當(dāng)前系統(tǒng)下int 的最大值和最小值。
#include <stdio.h>
#include <limits.h>
int main() {
printf("int最大值是:%d",INT_MAX);
printf("int最小值是:%d",INT_MIN);
}
下面是在64位系統(tǒng)下的輸出
int最大值是:2147483647
int最小值是:-2147483648
? 類似地柱徙,float.h頭文件中也定義一些明示常量缓屠,如FLT_DIG和DBL_DIG,分別表示float類型和double類型的有效數(shù)字位數(shù)护侮。表中所列都與float類型相關(guān)敌完。把明示常量名中的FLT分別替換成DBL和LDBL,即可分別表示double和long double類型對(duì)應(yīng)的明示常量(表中假設(shè)系統(tǒng)使用2的冪來表示浮點(diǎn)數(shù))
- printf() 函數(shù)
printf的占位符如下:
注意:printf()函數(shù)使用%符號(hào)來標(biāo)識(shí)轉(zhuǎn)換說明羊初,因此打印%符號(hào)就成了個(gè)問題滨溉。如果單獨(dú)使用一個(gè)%符號(hào),編譯器會(huì)認(rèn)為漏掉了一個(gè)轉(zhuǎn)換字符长赞。解決方法很簡(jiǎn)單晦攒,使用兩個(gè)%符號(hào)就行了:
pc = 2*6;
printf(" %d%% \n", pc);
輸出結(jié)果為 : 12% 。
下面是占位符的修飾符及含義:
下表為 printf() 中的標(biāo)記
- scanf() 函數(shù)
- 如果使用scanf() 讀取基本變量類型的值得哆,在變量名前加上一個(gè) & ;
- 如果使用scanf() 讀取字符串脯颜,不使用 & 。
- scanf() 使用空白(換行符贩据、制表符栋操、空格)把輸入分為多個(gè)字段(唯一例外的是 %c 會(huì)讀取包含空白在內(nèi)的每個(gè)字符)。
#include <stdio.h>
// 示例程序
int main() {
char name[100];
int age;
float weight;
printf("請(qǐng)輸入你的姓名饱亮,年齡矾芙,體重\n");
scanf("%s %d %f", name,&age,&weight);
printf("所以,你的姓名是%s,年齡是%d,體重是%f\n",name,age,weight);
return 0;
}
//運(yùn)行結(jié)果
請(qǐng)輸入你的姓名近尚,年齡蠕啄,體重
sunjian 23 75.0
所以场勤,你的姓名是sunjian,年齡是23,體重是75.000000
? 下表是scanf() 的轉(zhuǎn)換說明