|
如果想復(fù)習(xí)C語(yǔ)言的話可以看看哦。
數(shù)據(jù)
C語(yǔ)言程序中,一定會(huì)有數(shù)據(jù),這個(gè)數(shù)據(jù)就是由數(shù)字,單詞和字符構(gòu)成
數(shù)字又分整數(shù)和浮點(diǎn)數(shù)(浮點(diǎn)數(shù)就是小數(shù),數(shù)學(xué)里也稱實(shí)數(shù))
字符就是鍵盤(pán)上所有的
a b c A B C 這6個(gè)是字符
數(shù)字 '1' ' 2' ' 3' 這3個(gè)也是字符,但必須得是加了單引號(hào)的
+ - */ {}、 這些符號(hào)也是字符
空格鍵也是字符
這些都能在ASCII表能找到,反之能在ASCII表在能找到的就可以是字符 ASCII是什么,呵呵,這個(gè)上網(wǎng)查一下
還有就是單詞,也可以說(shuō)是字符串
就是比如 hello 或者 hello world
記住:字符用單引號(hào)表示,字符串用雙引號(hào)表示
整數(shù)不用我說(shuō)大家也該知道是什么
123 ,0, -234,1000 這些就是整數(shù)
浮點(diǎn)數(shù)(小數(shù))也就是凡是帶小數(shù)點(diǎn)的數(shù)就是浮點(diǎn)數(shù)
12.3 ,0.0,0.23,-7.7 這些就是小數(shù)(我還是直接說(shuō)小數(shù)好了,說(shuō)浮點(diǎn)有點(diǎn)不爽。
浮點(diǎn)數(shù)所占字節(jié)要比整數(shù)大,字節(jié)就是內(nèi)存里的東東,這個(gè)暫時(shí)不需了解
你只需知道小數(shù)占的字節(jié)要比整數(shù)大就可以了,后面字節(jié)這個(gè)概念很重要
例如123.4和1234
123.4就必1234所占的字節(jié)大
說(shuō)完數(shù)據(jù)類型我們說(shuō)變量
C語(yǔ)言把數(shù)據(jù)存放在變量中,變量就是電腦內(nèi)存里的一個(gè)盒子,用來(lái)保存數(shù)字或字符
這個(gè)盒子里面的東西是變化的,例如我放一個(gè)數(shù)字1放進(jìn)這個(gè)盒子,這個(gè)盒子現(xiàn)在裝的是數(shù)字1,然后我又放數(shù)字2進(jìn)入,原來(lái)的數(shù)字1就自動(dòng)替換成數(shù)字2,然后你放什么進(jìn)去,它就是總是替換,它是可變的。
數(shù)據(jù)類型就可以用變量來(lái)表現(xiàn)。
int 整數(shù)的意思 它可以申明變量用于存放整數(shù)
long int 存放大于32767和小于-32768的整型數(shù)據(jù)(這個(gè)我們暫時(shí)用不著,可以忽略)
float 浮點(diǎn)的意思,可以申明變量存放小數(shù)
double 雙點(diǎn),雙重的意思,存放更大的小數(shù)(這個(gè)也暫時(shí)用不著,先忽略)
char 字符的意思 申明變量存放字符。
每個(gè)變量都有名字,因?yàn)槟愕弥滥愦娣诺氖悄膫(gè)盒子,所有盒子得標(biāo)個(gè)記號(hào)
變量的名字必須用字母開(kāi)頭,大小寫(xiě)都可以,中間可以帶下劃線,例如age_cat
但絕對(duì)不能以數(shù)字開(kāi)頭 例如 95age
變量名也不能含空格和特殊字符 例如age cat 和 age*cat
有了變量名你就定義一個(gè)變量了,啥叫定義,也就是申明,或者說(shuō)建立
例如 int a 意思就是說(shuō)我用一個(gè)叫a變量 類型int 存放整數(shù)
或者說(shuō)我拿了一個(gè)盒子,做個(gè)標(biāo)記a 以后用來(lái)存放整數(shù)
int a
float b
char c
以上的就是定義不同類型的變量
但要記住,在一個(gè)程序中,變量名字不能重復(fù)
例如
int a
int a
或者
int a;
float a;
都是錯(cuò)誤的
變量名有唯一性。
定義了一個(gè)變量,我們就可以使用這個(gè)變量,可以在里面存放數(shù)據(jù)
怎么存放?直接用=號(hào)就可以了
可以在定義的時(shí)候存放
int a=1;
也可以在定義后存放
int a;
a=1;
還可以用表達(dá)式來(lái)存放
int a;
a=3-2;
甚至還可以加入其他變量
int a;
int b=2
a=b-1;
讓我們來(lái)個(gè)運(yùn)用變量的程序
#include <stdio.h>
viod main()
{
int a;
float b;
char c;
a=1;
b=1.1;
c='a';
}
把變量的值打印到屏幕上但是這個(gè)程序現(xiàn)在還沒(méi)有什么實(shí)質(zhì)性的作用,變量賦值以后你無(wú)法從電腦中看到
所以,接下來(lái)我們學(xué)習(xí)printf()函數(shù),我們把變量的值打印到屏幕上.
簡(jiǎn)單來(lái)說(shuō),printf()就是在屏幕上產(chǎn)生輸出,把字符,數(shù)字,字符串發(fā)送到屏幕上
printf()的格式
printf(“”);可以直接輸出引號(hào)里的東西
printf(“%d”,a)這樣是直接輸出變量int類型a的值
%d的意思:d是decimal base(十進(jìn)制)的開(kāi)頭字母,意思就是按十進(jìn)制格式輸出,也就是按整數(shù)格式輸出
還有%f 按浮點(diǎn)數(shù)格式輸出
%c 按字符格式輸出
printf(“%d”,a)的逗號(hào)后面只能放值,變量名可以,單純的值也可以,例如這樣printf(“%d”,1),也是可以的
連續(xù)輸出值可以這樣printf(“%d,%f,%c”,a,b,c),引號(hào)里的逗號(hào)不打也沒(méi)關(guān)系所以printf(“%d%f%c”,a,b,c)也是可以的,但是這樣會(huì)擠成一堆,自己試下就知道了,所以建議大家養(yǎng)成打逗號(hào)的習(xí)慣.
那么怎么進(jìn)行回車(chē)?這就需要\n了,\n是轉(zhuǎn)義符,意思就是它能把你不能用字符打出來(lái)的東西,換種形式出來(lái),在程序過(guò)程,你不可能中途又去按回車(chē)鍵.
轉(zhuǎn)義符還有很多個(gè),例如\t,\\,\*\a
\n只是其中一個(gè),其他的等用的時(shí)候在介紹吧,反正常用的也就一兩個(gè)
大家就只要牢記\n這一個(gè),記住是反斜號(hào),n是new-line (新的一行)的開(kāi)頭字母。
因?yàn)閒loat 定義的變量小數(shù)(浮點(diǎn)數(shù))默認(rèn)小數(shù)點(diǎn)后面保留6位數(shù),那怎么讓它輸出1.1?
只讓讓%f變成%.1f就可以了,反之你想讓它輸出小數(shù)點(diǎn)后兩位數(shù)就%.2f,三位就%.3f,以此類推。
其實(shí)轉(zhuǎn)化字符不止%d %c %f等,字符串也有一個(gè),就是%s string(字符串)的開(kāi)頭字母,但是用的少
盡管只打印字符串時(shí)可以不需要%S,但是當(dāng)打印與其他數(shù)據(jù)組合的字符串時(shí),就可能需要用%S
例如:
printf("%s %d %f %c","hello",14,7.2,'a');
打印結(jié)果如下
hello 14 7.200000 a
%s %d %f %c 這些是轉(zhuǎn)化符,注意不能放到引號(hào)外,打印時(shí)要適當(dāng)隔開(kāi),可以用空格或逗號(hào)隔開(kāi)。
在程序運(yùn)行過(guò)程中,手動(dòng)用鍵盤(pán)輸入變量的值能在程序中打印變量的值了,但也只能打印我們事先在程序中寫(xiě)好的值,能不能在程序過(guò)程中自己手動(dòng)用鍵盤(pán)輸入變量的值,在打印出來(lái)呢?答案是肯定的
這時(shí)我們就要學(xué)習(xí)scanf()這個(gè)函數(shù)
一般在程序中,printf()和scanf()是一起使用的
scanf()的功能是從鍵盤(pán)獲取數(shù)據(jù),同樣它也會(huì)用到轉(zhuǎn)化字符%d,%f,%c
scanf()的格式如下
scanf("%d",&a);
讓我們?cè)倏纯磒rintf();
printf("%d",a);
兩個(gè)差不多把,只不過(guò)scanf()比printf()多了一個(gè)&,&是什么?&是取地址符
scanf("%d",&a);意思就是你從鍵盤(pán)輸入一個(gè)整型變量的值,它會(huì)自動(dòng)存到變量a那個(gè)地址,也就是它會(huì)找到那么標(biāo)記為a的盒子,然后把值放進(jìn)里面
為什么printf()沒(méi)&,因?yàn)樗侵苯虞敵觯琣變量的地址已經(jīng)事先知道,而scanf() 變量a的值從外部獲取,得先知道變量a的地址,知道地址你才好把值放進(jìn)去
每個(gè)變量名都有對(duì)應(yīng)的地址,變量名只是地址的別名,就好像外號(hào)一樣,之所以用變量名而不用地址名,因?yàn)樽兞棵鹊刂访糜洠奖,而地址名是?shù)字,你不可能知道什么是什么
扯遠(yuǎn)了,內(nèi)存地址在學(xué)指針的時(shí)候你就會(huì)知道,現(xiàn)在先別管這些,知道太細(xì)反而越弄越糊涂,你現(xiàn)在就只需要知道scanf()的格式
scanf("%d",&a);
和print()差不多,但是變量名前一定要加&,除了scanf("%s",a);字符串格式就不需要,這也跟指針有關(guān)系,現(xiàn)在先別管,你只要知道除了%S,其他類型的變量都要在前面加&, 引號(hào)里面注意不要加\n,沒(méi)必要
連續(xù)輸入也是可以的,scanf("%d,%f",&a,&b);但目前先不要用
下面我們來(lái)個(gè)輸入(scanf)輸出(printf)的程序
#include <stdio.h>
void main()
{
int a;
float b;
char c;
printf("請(qǐng)輸入a的值:");
scanf("%d",&a);
printf("請(qǐng)輸入b的值:");
scanf("%f",&b);
printf("請(qǐng)輸入c的值:");
scanf("%c",&c);
printf("a的值為:%d,b的值為:%f,C的值為:%c\n",a,b,c);
}
這個(gè)是正確的嗎?你運(yùn)行的時(shí)候你就會(huì)發(fā)現(xiàn),變量c沒(méi)辦法輸入了,程序直接結(jié)束
哪里有問(wèn)題?
下面我們來(lái)分析
首先程序顯示 請(qǐng)輸入a的值:
我們輸入1,在按回車(chē)鍵
又會(huì)顯示 請(qǐng)輸入b的值:
我們輸入1.1 按回車(chē)
這時(shí)候程序就會(huì)顯示
請(qǐng)輸入c的值:a的值為:1,b的值為:1.100000,C的值為:
這是為什么?別忘了之前說(shuō)過(guò),空格和回車(chē)也是字符
開(kāi)始輸入了1到了變量a里,按回車(chē),繼續(xù)下一個(gè)輸入
又輸入了1.1到了變量b里
此時(shí)再按回車(chē)的話,就會(huì)被scanf接收了,因?yàn)樽兞縞是字符格式,回車(chē)也是字符,自動(dòng)存到變量c里
非字符變量,用scanf連續(xù)輸入,按空格或回車(chē)會(huì)等待下一個(gè)輸入
但是字符和字符串變量,scanf會(huì)直接接收空格和回車(chē)
怎么解決?在%c前面加一個(gè)空格,就是這樣scanf(" %c",&c);
實(shí)質(zhì):空格作為分隔符。
#include <stdio.h>
main()
{
int a;
float b;
char c;
printf("請(qǐng)輸入a的值:");
scanf("%d",&a);
printf("請(qǐng)輸入b的值:");
scanf("%f",&b);
printf("請(qǐng)輸入c的值:");
scanf(" %c",&c);
printf("a的值為:%d,b的值為:%f,C的值為:%c\n",a,b,c);
}
這樣程序就能正常運(yùn)行
所以不管什么變量類型,最好都在前面加個(gè)空格,會(huì)是一個(gè)好習(xí)慣
scanf()是格式化輸入函數(shù),顧名思義,就是你在輸入時(shí)必須按照指定的格式輸入才行。
把scanf("%d %d",&a,&b);改成scanf("%d,%d",&a,&b);中間加一個(gè)逗號(hào)
那么,再怎么輸入?
注意:輸入時(shí),scanf()的雙引號(hào)中出現(xiàn)什么非格式說(shuō)明符就打什么,無(wú)論出現(xiàn)什么你就照打什么。
先輸入1,再輸入,(逗號(hào)),再輸入2,最后回車(chē)。
就是這樣:1,2 回車(chē)
結(jié)果也是a=1,b=2,如果輸入1就回車(chē),那么b的值就沒(méi)辦法獲取,而是你想不到的結(jié)果(這個(gè)自己去運(yùn)行)。
\n在前面和中間你可以無(wú)視,但是如果是在后面scanf("%d%d\n",&a,&b);
就必須這樣打了,輸入1 回車(chē),輸入2,回車(chē),輸入任何一個(gè)或多個(gè)字母,數(shù)字或字符最后回車(chē)
結(jié)果就是正確的 a=1,b=2
原因:此時(shí)輸入數(shù)據(jù)用轉(zhuǎn)義符結(jié)尾,scanf會(huì)跳過(guò)空白符去讀下一個(gè)字符,所以你必須再輸入一個(gè)東西(隨便一個(gè)或多個(gè)字母,數(shù)字,字符)。這里的空白符包括:空格,制表符,換行符,回車(chē)符和換頁(yè)符。
就是說(shuō)scanf()里面多了個(gè)\n,scanf會(huì)跳過(guò)你輸入后按的回車(chē)鍵或空格鍵,再讀取一個(gè)東西,直到?jīng)]地方存儲(chǔ)才會(huì)結(jié)束scanf
注意空格也包括scanf("%d%d ",&a,&b); 和\n一樣的道理,要多加小心
所以說(shuō)\n根本沒(méi)必要在scanf里
我們?cè)诟膕canf("%c%c",&a,&b);變scanf("%c,%c",&a,&b);加逗號(hào)
這個(gè)和非字符變量一樣,也是輸入 x,y 回車(chē)
結(jié)果是a=x,b=y
在改成空格,scanf("%c%c",&a,&b);字符變量這回是可以打空格也可以不打
輸入x y(中間空多少格都沒(méi)關(guān)系)回車(chē) 或者xy 回車(chē)
結(jié)果a=x,b=y
值得注意是scanf("%c%c",&a,&b);這種情況可千萬(wàn)不要打空格,不然空格的值會(huì)傳到變量b里
補(bǔ)充:scanf("a=%d,b=%d,c=%d",&a,&b,&c);
輸入應(yīng)為:
a=1,b=2,c=3 回車(chē)
跟我上面說(shuō)的照打原理一樣
下面我們來(lái)說(shuō)說(shuō)注釋,就是解釋說(shuō)明
電腦能夠理解你的程序,然后,其他人或許也會(huì)讀你的程序,另外,你會(huì)經(jīng)常修改程序,如果程序非常龐大,你可能不記得你之前寫(xiě)的東西有什么功能,別人看了沒(méi)有注釋的代碼也很難知道是什么意思
如果你寫(xiě)的程序只是你自己使用,就不需要注釋了嗎?不是的,即使你當(dāng)時(shí)懂,但過(guò)后很久,你也有可能會(huì)看不懂,所以,給程序加注釋是非常好的習(xí)慣
注釋怎么用?注意:我們加注釋不是給電腦看的,而是給我們?nèi)丝吹,電腦會(huì)無(wú)視我們的注釋,不會(huì)運(yùn)行
#include <stdio.h>
void main()
{
printf("hello world\n"); /*打印hello world*/
}
/*.....*/ 這就是注釋的第一種格式
#include <stdio.h>
main()
{
printf("hello world\n"); //打印hello world
}
// 這是注釋的第2種格式
顯然第2種比較好打
接下來(lái)我們來(lái)學(xué)習(xí)數(shù)組吧盡管C語(yǔ)言沒(méi)有字符串變量(字符串知道是啥吧)
但仍然有辦法存儲(chǔ)字符串,那就是用數(shù)組(array)
數(shù)組是一種特殊的變量類型
所有的數(shù)據(jù)類型int,float,char等,都有對(duì)應(yīng)的數(shù)組類型
數(shù)組只不過(guò)是具有形同數(shù)據(jù)類型的許多變量的一個(gè)列表而已
說(shuō)不多說(shuō),怎么定義一個(gè)數(shù)組?
char a[12]; 這就是定義了一個(gè)字符型的數(shù)組
跟普通定義變量而言,它只是多了個(gè)方括號(hào),方括號(hào)里的數(shù)字代表的是數(shù)組里所存儲(chǔ)的字符長(zhǎng)度(就是有多少個(gè)字符)
比如
char a[3]={'a','b','c'} 這是純字符數(shù)組
數(shù)組是有下標(biāo)的,表示是哪個(gè)字符存放在哪個(gè)數(shù)組變量
下標(biāo)都是從0開(kāi)始的
a[0]='a',a[1]='b',a[2]='c' 注意這里就沒(méi)有a[3]了哈
a[0],a[1],a[2]其實(shí)就是變量,跟平時(shí)的變量a,b,c沒(méi)什么區(qū)別,只不過(guò)變量名是個(gè)死東西,不能改變,它們的值是可以改變的
例如
char a[3]={'a','b','c'};
a[0]='b';
打印出來(lái)的數(shù)組就是b,b,c了
還有
char a[4]="abc";
為什么明明是3個(gè)字符,寫(xiě)著卻是4?
其實(shí)就個(gè)數(shù)組就是存儲(chǔ)的字符串,多出的字符是什么,就是‘\0',叫做NULL零,當(dāng)然還有別的叫法
C語(yǔ)言用字符串結(jié)尾的'\0'來(lái)識(shí)別字符串的結(jié)束,在內(nèi)存中,只有當(dāng)c程序遇到null零時(shí)猜知道字符串結(jié)束了
當(dāng)然也可以這樣存儲(chǔ)
char a[4]={'a',"b","c",'\0'}這就代表它存儲(chǔ)的是字符串
也可以不寫(xiě)長(zhǎng)度
char a[]="abc";
記住你所存儲(chǔ)的數(shù)據(jù)所超過(guò)長(zhǎng)度,會(huì)報(bào)錯(cuò)的。
下面我們來(lái)輸入一個(gè)字符串,在打印出來(lái)
因?yàn)槲覀冞不知道輸入字符串是多少字符,所以盡量定義的長(zhǎng)度大一點(diǎn)
首先定義了個(gè)字符數(shù)組變量 char a[50];長(zhǎng)度50,也就是可以容納50個(gè)字符變量
怎么用scanf()輸入? scanf(" %s",a); 就可以了,為什么沒(méi)有&,我前面已經(jīng)說(shuō)過(guò)了哦,跟指針有關(guān)系,等你學(xué)了才會(huì)知道,記住只有%S 格式可以不需要&哦
下面我們開(kāi)始程序
#include <stdio.h>
main()
{
char a[50];
printf("請(qǐng)輸入一個(gè)字符串\n");
scanf(" %s",a);
printf("字符串為:%s\n",a);
}
我們輸入hello 結(jié)果顯示字符串為:hello
但如果我們輸入hello world 結(jié)果也顯示字符串為:hello
因?yàn)橛袀(gè)空格,scanf()在%c字符格式會(huì)接收空格(空格也是字符)
但在字符串格式%s中 scanf()遇到空格、回車(chē)和Tab鍵都會(huì)認(rèn)為輸入結(jié)束
那怎么讓字符串輸入包含空格,那也是我們下面的內(nèi)容了。
其他輸入輸出函數(shù)除了printf()和scanf()函數(shù),C語(yǔ)言還有其他輸入輸出函數(shù),并且他們提供了一些printf()和scanf()沒(méi)有的功能
我們老學(xué)輸入輸出干什么,別急,這些輸入輸出函數(shù)將是我們以后將要用到的
我們目前只學(xué)6個(gè)
putchar()和getchar()
putch()和getch()
puts和gets()
putchar()是輸出函數(shù),看它的英文名很容易明白,是跟字符有關(guān)的,它的功能是把一個(gè)字符打印到屏幕
只能一次打一個(gè)字符 putchar('a');
屏幕上出顯示一個(gè)字符a
打印字符變量的時(shí)候不需要引號(hào)
這點(diǎn)要比printf()好 printf()需要這樣打印printf("%c",a);
下面程序是putchar()和printf()分別打印字符變量a
#include <stdio.h>
main()
{
char a='x';
putchar(a);
putchar('\n');
printf("%c\n",a);
}
可見(jiàn)putchar()打印字符變量是非常方便的,但用它直接打字符是非常愚蠢的行為,還不如用printf()
但是putchar()一次只能打印一個(gè)字符,它的用處會(huì)在以后的程序中逐步體現(xiàn),瞧著吧
getchar()函數(shù)的功能是輸入一個(gè)字符(就是從鍵盤(pán)獲取一個(gè)字符),和putchar()是對(duì)應(yīng)的
怎么從鍵盤(pán)獲取一個(gè)字符?這樣嗎?
char a;
getchar(a);
這是錯(cuò)的。
正確獲取是這樣
char a;
a=getchar();
當(dāng)你從鍵盤(pán)按下一個(gè)字符,它就會(huì)自動(dòng)存到變量a里,可以理解為a的值等于你按下的某個(gè)鍵的值,記住括號(hào)里不要放東西
顯然這種輸入比scanf("%c",&a) 方便多了,但也只是對(duì)于輸入一個(gè)字符來(lái)說(shuō)方便,scanf可以連接輸入,而getchar一次只能輸入一個(gè)字符。
盡管getchar()只獲取一個(gè)字符,但當(dāng)你在鍵盤(pán)按下一個(gè)鍵后,那個(gè)字符并不是馬上被getchar()獲取,而是到了緩沖區(qū)里,緩沖區(qū)是一塊為輸入預(yù)留的內(nèi)存區(qū)域,緩沖區(qū)不會(huì)釋放,直到你按下回車(chē),緩沖區(qū)里的內(nèi)容才一次一個(gè)字符的方式釋放,這好比你寄東西給你朋友,郵局就相當(dāng)于緩沖區(qū),郵局向你征詢要不要確定寄出去,在你確定之前你如果后悔又可以拿回自己的東西,所以你在輸入字符的時(shí)候還可以用退格鍵重新修改或不再輸入,而回車(chē)既等于確定卻又是一個(gè)字符,回車(chē)自己本身也會(huì)進(jìn)入緩沖區(qū)
下來(lái)來(lái)個(gè)例子
#include <stdio.h>
main()
{
char a,b;
a=getchar();
b=getchar();
putchar(a);
putchar(b);
}
我們輸入x-回車(chē)-y-回車(chē)
結(jié)果會(huì)是xy嗎?不是的結(jié)果是a=x b='\n'(回車(chē))
當(dāng)我們開(kāi)始打x的時(shí)候,x在緩沖區(qū),當(dāng)我們按下回車(chē)的時(shí)候,第一個(gè)getchar()才獲取到x這個(gè)值 順利存到a里 但回車(chē)既是確定又是字符,回車(chē)'\n'它也跟著進(jìn)了緩沖區(qū),并且和x一起被釋放,x到了程序里 回車(chē)('\n')也到了程序里,并且被第2個(gè) getchar()獲取,此時(shí)我們輸入y,這時(shí)緩沖區(qū)里有一個(gè)字符 'y', 然后我們又按下回車(chē),'y'和'\n'又一起準(zhǔn)備被釋放,由于程序里沒(méi)有第3個(gè)getchar(),所以'y'和'\n'還留在緩沖區(qū),但它們兩個(gè)已經(jīng)是在準(zhǔn)備狀態(tài)中,如果程序又出現(xiàn)一個(gè)getchar(),'y'不需要你按回車(chē)它會(huì)直接進(jìn)入到第3個(gè)getchar(),getchar()是依次獲取,按先后順序,不會(huì)先獲取'\n',而'\n'正等待著馬上進(jìn)入第4個(gè)getchar()
下面這個(gè)程序很好的說(shuō)明了這個(gè)問(wèn)題
#include <stdio.h>
main()
{
char a,b,c,d;
a=getchar();
b=getchar();
c=getchar();
d=getchar();
printf("a獲取的是%c\n",a);
printf("b獲取的是%c\n",b);
printf("c獲取的是%c\n",c);
printf("d獲取的是%c\n",d);
}
總結(jié)來(lái)說(shuō),當(dāng)你輸入x '\n'(回車(chē)) 這兩個(gè)字符已經(jīng)同時(shí)從緩沖區(qū)釋放了出來(lái),被兩個(gè)getchar()分別獲取,‘\n’(回車(chē))它進(jìn)入緩沖區(qū)后會(huì)連同自己帶著'x'又馬上一起出來(lái) 輸入 y '\n'(回車(chē)) 這兩個(gè)字符也被同時(shí)釋放,被其他的getchar()分別獲取。
第2種解決辦法就是我們接下來(lái)要學(xué)的輸入輸出函數(shù)
那就是getch()和putch()函數(shù),其實(shí)用法和putchar()和getchar()是一樣的
不過(guò)用之前我們得在程序最上面需要加上#include<conio.h>這個(gè)頭文件,因?yàn)橹挥羞@個(gè)頭文件包含這兩個(gè)函數(shù)
這兩個(gè)也是輸入輸出一個(gè)字符,但它們不再有緩沖區(qū)的概念,就是你不再需要按回車(chē)在確定了,你輸入什么它會(huì)直接進(jìn)入程序里,且不等你的回車(chē)
#include <stdio.h>
#include <conio.h>
main()
{
char a,b;
a=getch();
b=getch();
putchar(a);
putchar(b);
}
當(dāng)你輸入xy 不需要按回車(chē),等你輸入完之后它會(huì)立即顯示到屏幕上
也就是你輸入x立馬就進(jìn)入程序被第一個(gè)getch()獲取,輸入y立馬被第2個(gè)getch()獲取,不再進(jìn)入緩沖區(qū)等待回車(chē)來(lái)確定
不過(guò)你在輸入的時(shí)候,屏幕上不會(huì)顯示你正在輸入的東西,也就是一片空白,直到你完成輸入它就會(huì)直接顯示結(jié)果
如果你要在屏幕上顯示你正在打的東西,就需要用putch()函數(shù)。
getch()也能接收回車(chē),不過(guò)是'\r',return的開(kāi)頭,即回到當(dāng)前行的行首,\n是換行,回車(chē)其實(shí)是兩個(gè)字符一起,分別是\r,\n。\r是回車(chē),即回到當(dāng)前行的行首,\n是換行,兩個(gè)效果合起來(lái)就是我們所熟悉的到下一行開(kāi)頭。
getchar()接收回車(chē) 首先接收到"\r"會(huì)去讀緩沖區(qū),如果緩沖區(qū)沒(méi)有東西,它會(huì)開(kāi)始等待,直到'\n'過(guò)來(lái)了,然后'\n'就進(jìn)到緩沖區(qū)里,被getchar()獲取,至于'\r',它不會(huì)進(jìn)緩沖區(qū)
而getch() 沒(méi)緩沖區(qū),它接收到的第一個(gè)字符就是'\r'
之所以把'\n'稱做回車(chē),是讓大家便于理解,但'\n'不完全等于回車(chē),它其實(shí)是換行
好像越說(shuō)越復(fù)雜了,看不懂也沒(méi)關(guān)系,你現(xiàn)在只要知道getch()按回車(chē)并不是接收'\n'就可以了,那些以后會(huì)慢慢懂的
getch()自己本身也是值
所以printf("%c",getchar());也可以,和getchar()一樣
getch()有個(gè)缺點(diǎn),因?yàn)闆](méi)緩沖區(qū)的關(guān)系,你輸入的時(shí)候就不能在修改了,緩沖區(qū)相當(dāng)于草稿,但它的優(yōu)點(diǎn)就是不需要回車(chē)來(lái)確定了
有點(diǎn)用途大家很熟悉 就是程序需要你按(Y/N)的時(shí)候
按Y繼續(xù),按N退出,這時(shí)直接按Y或N就可以了,而不需要再按一次回車(chē)
這里大家只要了解getch()函數(shù)就可以了 putch()基本不用的。
puts()和gets()輸出輸入函數(shù)接下來(lái)我們學(xué)習(xí)puts()和gets()輸出輸入函數(shù),這兩個(gè)函數(shù)提供了一種更容易的方法來(lái)打印和獲取字符串
下面定義一個(gè)字符數(shù)組
char a[50];
用gets()獲取字符串 gets(a);
然后用puts()打印字符串 puts(a);
get是獲取的意思,從鍵盤(pán)獲取值,gets()既能獲取一個(gè)字符也能獲取多個(gè)字符,也就是字符串,它能獲取到帶空格的字符串,自動(dòng)在末尾加上NULL零,這都正是我們想要的
puts()能打印一個(gè)字符也能打印字符串,而且在打印后面會(huì)自動(dòng)換行(加個(gè)'\n',不過(guò)你看不到)
puts()也能直接打印 puts("hello world"); 并且自動(dòng)換行,不需要打'\n'
下面這個(gè)程序
#include <stdio.h>
main()
{
char a[50];
puts("請(qǐng)輸入一個(gè)字符串");
gets(a);
puts(a);
}
輸入hello world就能順利輸出hello world了
gets()既能獲取單個(gè)字符,又能獲取到帶空格的字符串,并且自動(dòng)在字符串末尾加上NULL零
puts()既能打印單個(gè)字符,又能直接輸出任何字符格式,并且自動(dòng)換行
有了puts(),gets()我們是不是可以拋棄printf() scanf() putchar()getchar()?
答案是否定的,這就需要介紹3者各自的功能
printf()和scanf()是格式輸出輸入函數(shù),最后的f是format(格式)的意思
putchar() getchar() 輸出輸入函數(shù)只針對(duì)單個(gè)字符的操作
puts(),gets() 輸出輸入函數(shù)可以單個(gè)字符操作(但是功能有限的),主要是針對(duì)字符串操作
下面我們定義
int a
用scanf("%d",a)可以獲取整型a的值,a=getchar(),gets(a)無(wú)法從鍵盤(pán)獲取數(shù)字
用printf("%d",a)可以打印數(shù)字a的值,putchar(a),puts(a)沒(méi)法打印
數(shù)字方面:printf()和scanf()勝
char a
用scanf("%c",&a)可以獲取字符a的值,用a=getchar()能獲取a的值,用gets(a)不能獲取
用printf("%c",a)可以打印字符a的值 用a=getchar()可以打印a的值,用puts(a)不能打印
字符方面:getchar()和putchar()第1 scanf()和printf()第2 gets和puts()敗
補(bǔ)充:puts()和gets()能接收和打印單個(gè)字符只限制變量是數(shù)組變量
可見(jiàn)scanf()和printf()什么都能實(shí)現(xiàn),但對(duì)字符和字符串操作沒(méi)有其他兩種好
getchar()和putchar()對(duì)字符操作優(yōu)勢(shì)明顯,但不能操作數(shù)字變量,字符數(shù)組變量
gets()和puts()對(duì)字符串操作優(yōu)勢(shì)明顯,但也不能操作數(shù)字變量,字符變量
scanf()和printf()格式輸入輸出能同時(shí)按格式一起輸入輸出字符,數(shù)字,字符串
這是其他兩種不能比的
所以程序以scanf()和printf()為主,其他兩種作為輔助,發(fā)揮各自的長(zhǎng)處
如果大家還對(duì)這些感到暈的話,也不要急,它們各自的功能將會(huì)在以后的程序中完全體現(xiàn)出來(lái),你也會(huì)更容易理解.
另外我在說(shuō)一下緩沖區(qū)的問(wèn)題,是針對(duì)scanf()的
首先是
#include <stdio.h>
main()
{
char a, b,c;
scanf("%c",&a);
scanf("%c",&b);
scanf("%c",&c);
printf("%c,%c,%c",a,b,c);
}
%c是能接收空格和回車(chē)(既是確定又是字符)的
當(dāng)輸入x 回車(chē)兩個(gè)同時(shí)被釋放,被變量a,b分別獲取
輸入y 回車(chē) y被釋放,回車(chē)準(zhǔn)備釋放狀態(tài),y被c獲取
和getchar()緩沖區(qū)原理一樣把
scanf()怎么去掉回車(chē)?前面很早就說(shuō)過(guò)了,在%前面加個(gè)空格
#include <stdio.h>
main()
{
char a, b,c;
scanf("%c",&a);
scanf(" %c",&b);
scanf(" %c",&c);
printf("%c,%c,%c",a,b,c);
}
上面輸入x 回車(chē)兩個(gè)同時(shí)被釋放 x被a獲取 回車(chē)到了第2個(gè)scanf的那個(gè)空格里
輸入y 回車(chē) y被b獲取回車(chē)到了第3個(gè)scanf那個(gè)空格里
輸入z 回車(chē) z被c獲取回車(chē)則是準(zhǔn)備釋放狀態(tài)中
scanf("%s",a);,gets(a)遇到回車(chē)和空格
scanf("%s",a);以遇到空格為輸入結(jié)束的標(biāo)志(前提是緩沖區(qū)有值),值還在緩沖區(qū)等回車(chē)來(lái)確定釋放,但%s格式不會(huì)讓回車(chē)和空格進(jìn)入緩沖區(qū),也不會(huì)讓空格和回車(chē)存入%s格式的a里
scanf("%s",a);遇到回車(chē)結(jié)束和釋放同時(shí)進(jìn)行,回車(chē)不進(jìn)入緩沖區(qū)
gets(a),以遇到回車(chē)為結(jié)束的標(biāo)志,不管緩沖區(qū)有沒(méi)有值,遇到回車(chē)馬上結(jié)束,回車(chē)不進(jìn)入緩沖區(qū)
gets(a);遇到空格等于遇到字符,沒(méi)特殊含義
scanf("%c",&a);,a=getchar()遇到回車(chē)和空格
scanf("%c",&a);,遇到空格會(huì)直接被a獲取,然后進(jìn)入緩沖區(qū)等待回車(chē),回車(chē)也進(jìn)入緩沖區(qū)和緩沖區(qū)的值一起釋放
scanf("%c",&a);,遇到回車(chē)也會(huì)直接被a獲取,且同時(shí)和回車(chē)一起從緩沖區(qū)釋放
a=getchar()原理和scanf("%c",&a);,一樣 因?yàn)閟canf("%c",&a)等于a=getchar()
還有這種
#include <stdio.h>
main()
{
char a;
int b;
scanf("%c",&a);
scanf("%d",&b);
printf("%c,%d",a,b);
}
輸入a1b4,在緩沖區(qū)是怎樣的,首先a1b4先進(jìn)入緩沖區(qū),再按回車(chē) a1b4和回車(chē)一起釋放,scanf()函數(shù)本質(zhì)上是一種"模式匹配"函數(shù),首先第一個(gè) scanf()讀取緩沖區(qū)里的數(shù)據(jù) %c格式只能保存一個(gè)字符,所以a被第一個(gè)scanf()拿走了,1b4繼續(xù)留在緩沖區(qū),接著第2個(gè)scanf()讀取,%d格式獲取1成功,但獲取到b時(shí),由于格式不匹配,放棄b ,由于%d已經(jīng)獲取了一個(gè)數(shù)字,所以4也放棄了, b4和回車(chē)就繼續(xù)留到緩沖區(qū)里準(zhǔn)備釋放中
好了,緩沖區(qū)內(nèi)容告一段落!
最后來(lái)個(gè)總結(jié),用程序表示
#include <stdio.h>
main()
{
char a,b[50];
printf("請(qǐng)輸入第一個(gè)字符:\n");
scanf(" %c",&a);
getchar(); //獲取前面的回車(chē)
printf("第一個(gè)的字符為:%c\n",a);
printf("請(qǐng)輸入第二個(gè)字符:\n");
a=getchar();
printf("第二個(gè)字符為:");
putchar(a);
putchar('\n');
printf("請(qǐng)輸入第一個(gè)字符串:\n");
scanf(" %s",&b);
getchar(); //獲取前面的回車(chē)
printf("第一個(gè)的字符為:%s\n",b);
puts("請(qǐng)輸入第二個(gè)字符串:");
gets(b);
puts("第二個(gè)字符串為:");
puts(b);
}
上面那幾種輸入輸出函數(shù)應(yīng)該都知道怎么用了吧
還有緩沖區(qū),應(yīng)該也知道個(gè)大概了吧,我可能說(shuō)的不夠詳細(xì),沒(méi)辦法讓你真正了解,不過(guò)沒(méi)關(guān)系,以后我們會(huì)對(duì)緩沖區(qū)進(jìn)行全方位的了解,還會(huì)學(xué)到清空緩沖區(qū)的方法,這里你們主要該掌握一些基本的輸入輸出函數(shù)的用法,以及注意緩沖區(qū)留下來(lái)的回車(chē)
好了,輸入輸出介紹完畢
完整的Word格式文檔51黑下載地址:
從零開(kāi)始學(xué) -C語(yǔ)言-1.doc
(78.5 KB, 下載次數(shù): 25)
2018-12-2 14:31 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|