c語言標(biāo)準(zhǔn)輸出函數(shù)
首先說明,Windows系統(tǒng)對'\n'的處理結(jié)果為”回車換行”,相當(dāng)于Linux中的'\r', '\n'兩個字符
一、標(biāo)準(zhǔn)輸出函數(shù)
1. printf()
printf()的常用格式化有:%d, %f, %c, %s, %p, %x, %X, %%
%p與%x / %X的區(qū)別:%p格式化需要void*類型的參數(shù),而%x / %X需要unsigned int類型的參數(shù),也就是說%p用于以16進(jìn)制打印地址(指針),%x / %X用于以16進(jìn)制打印數(shù)值(非指針),%p, %x / %X打印結(jié)果均無前導(dǎo)0x / 0X,%p打印結(jié)果有前導(dǎo)0而%x / %X沒有前導(dǎo)0
%s:對應(yīng)參數(shù)為字符指針,可以輸出對應(yīng)的字符串,識別到'\0'時(shí)結(jié)束,不會添加‘\n'
傳入printf()中的某格式控制符與參數(shù)列表中的對應(yīng)參數(shù)類型不匹配時(shí),將以該格式輸出0
2.putchar()
使用putchar()輸出變量時(shí),傳入變量名即可
使用putchar()輸出常量時(shí),傳入該字符的ASCII碼或以格式‘/*單個字符常量*/’傳入?yún)?shù)均可
以下使用方式是錯誤的:
以“/*字符串*/”格式傳入字符串將打印一個?
以‘/*多個字符常量*/'格式傳入多個字符串將打印最后一個字符
#include
int main(void)
{
char a = 35;
//輸出#
putchar(a);
//輸出a
putchar('a');
//輸出?
putchar("a");
//輸出#
putchar(35);
//輸出5
putchar('35');
//輸出?
putchar("35");
return 0;
}
3.puts()
首先說明:C編譯器為字符串分配內(nèi)存時(shí),會在若干字符末尾后綴一個’\0'結(jié)束符,所以在未知字符串長度時(shí),所有字符串處理函數(shù)都以識別到'\0'作為字符串結(jié)束標(biāo)志,在未知字符串長度的情況下使用字符串處理函數(shù)處理任何沒有'\0'的字符串將導(dǎo)致非法內(nèi)存訪問(數(shù)組越界),輕則輸出亂碼,重則程序異常終止
//逐個字符為字符數(shù)組賦值時(shí)必須手動加'\0'
char string[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };//合法
char string[ ] = { 'h', 'e', 'l', 'l', 'o', '\0' };//合法
char string[5] = { 'h', 'e', 'l', 'l', 'o' };//非法
char string[ ] = { 'h', 'e', 'l', 'l', 'o' };//非法
//以字符串為字符數(shù)組賦值時(shí)編譯器將自動加'\0'
char string[ ] = { "hello" };//合法
char string[ ] = "hello";//合法
//字符數(shù)組實(shí)際長度為 字符總數(shù) + 1
char string[6] = "hello"http://合法
char string[5] = "hello"http://編譯器將報(bào)錯
使用puts()時(shí),傳入字符指針可以輸出對應(yīng)的字符串,識別到'\0'時(shí)結(jié)束,并輸出一個'\n'
二、標(biāo)準(zhǔn)輸入函數(shù)
1.scanf()
首先說明:輸入緩沖區(qū)(stdin)是內(nèi)存中的一個隊(duì)列(FIFO),有先入先出的性質(zhì),可以使用多種方法清空輸入緩沖區(qū)
//定義在stdio.h中,用于清空輸入緩沖
fflush(stdin);
//定義在stdio.h中,用于清空輸入緩沖
rewind(stdin);
//該方法在以敲回車作為輸入結(jié)束標(biāo)志時(shí)可以使用
while (getchar() != '\n');
scanf()從內(nèi)存中的輸入緩沖區(qū)中讀取數(shù)據(jù),若讀取正常,未被讀取完的數(shù)據(jù)將繼續(xù)留在輸入緩沖區(qū),若讀取異常,輸入緩沖區(qū)將被清空
函數(shù)返回值為實(shí)際讀取成功的變量個數(shù),一個都沒成功會返回EOF值(在stdio.h中define為-1)
%c:會把包括空白符,控制符在內(nèi)的所有內(nèi)容都讀走
%s:使用%s輸入字符串時(shí)遇到空白符即停止,空白符會留在輸入緩沖區(qū)
PS:scanf()格式化中的若干細(xì)節(jié)
1)當(dāng)格式控制符之間緊鄰時(shí),以空格或tab鍵作為輸入變量時(shí)的分隔
2)當(dāng)scanf()引號內(nèi)開頭有空白字符時(shí),將跳過輸入緩沖區(qū)開頭的若干空白符
3)當(dāng)scanf()引號中任意位置有非空白字符時(shí),緩沖區(qū)中數(shù)據(jù)必須與之匹配
4)當(dāng)scanf()引號內(nèi)非開頭位置有空白符時(shí),緩沖區(qū)中數(shù)據(jù)必須與之匹配
5)不要在scanf()引號內(nèi)末尾添加字符,否則讀取完成還會繼續(xù)向后匹配,不但沒什么作用(格式控制字符串中內(nèi)容比stdin中多或匹配失敗均會結(jié)束調(diào)用并清空stdin,stdin中內(nèi)容比格式控制字符串中多會結(jié)束調(diào)用但保留stdin中多余內(nèi)容),萬一字符串被掃描到末尾的同時(shí)stdin剛好為空還會導(dǎo)致死循環(huán)
2.getchar()
getchar()不需要參數(shù),返回值即為輸入的字符
3.gets()