久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2973|回復: 4
收起左側

從零開始學C語言(Word格式教程下載)

[復制鏈接]
ID:434742 發(fā)表于 2018-12-2 14:32 | 顯示全部樓層 |閱讀模式
如果想復習C語言的話可以看看哦。

數據
C語言程序中,一定會有數據,這個數據就是由數字,單詞和字符構成

數字又分整數和浮點數(浮點數就是小數,數學里也稱實數)

字符就是鍵盤上所有的

a b c   A B C     這6個是字符
數字 '1' ' 2' ' 3'    這3個也是字符,但必須得是加了單引號的
+ - */ {}、 這些符號也是字符
    空格鍵也是字符  

這些都能在ASCII表能找到,反之能在ASCII表在能找到的就可以是字符 ASCII是什么,呵呵,這個上網查一下

還有就是單詞,也可以說是字符串
就是比如 hello 或者 hello world   

記住:字符用單引號表示,字符串用雙引號表示

整數不用我說大家也該知道是什么
123 ,0, -234,1000 這些就是整數

浮點數(小數)也就是凡是帶小數點的數就是浮點數
12.3 ,0.0,0.23,-7.7 這些就是小數(我還是直接說小數好了,說浮點有點不爽啊)

浮點數所占字節(jié)要比整數大,字節(jié)就是內存里的東東,這個暫時不需了解
你只需知道小數占的字節(jié)要比整數大就可以了,后面字節(jié)這個概念很重要

例如123.4和1234
123.4就必1234所占的字節(jié)大

說完數據類型我們說變量
C語言把數據存放在變量中,變量就是電腦內存里的一個盒子,用來保存數字或字符
這個盒子里面的東西是變化的,例如我放一個數字1放進這個盒子,這個盒子現(xiàn)在裝的是數字1,然后我又放數字2進入,原來的數字1就自動替換成數字2,然后你放什么進去,它就是總是替換,它是可變的。

數據類型就可以用變量來表現(xiàn)。

int 整數的意思 它可以申明變量用于存放整數
long int 存放大于32767和小于-32768的整型數據(這個我們暫時用不著,可以忽略)

float 浮點的意思,可以申明變量存放小數
double 雙點,雙重的意思,存放更大的小數(這個也暫時用不著,先忽略)
char 字符的意思 申明變量存放字符。
每個變量都有名字,因為你得知道你存放的是哪個盒子,所有盒子得標個記號

變量的名字必須用字母開頭,大小寫都可以,中間可以帶下劃線,例如age_cat
但絕對不能以數字開頭 例如 95age
變量名也不能含空格和特殊字符 例如age cat 和 age*cat

有了變量名你就定義一個變量了,啥叫定義,也就是申明,或者說建立
例如 int a    意思就是說我用一個叫a變量 類型int 存放整數
或者說我拿了一個盒子,做個標記a 以后用來存放整數

int a
float b
char c

以上的就是定義不同類型的變量
但要記住,在一個程序中,變量名字不能重復
例如
int a  
int a
或者
int a;
float a;
都是錯誤的

變量名有唯一性。
定義了一個變量,我們就可以使用這個變量,可以在里面存放數據
怎么存放?直接用=號就可以了

可以在定義的時候存放
int a=1;
也可以在定義后存放
int a;
a=1;

還可以用表達式來存放
int a;
a=3-2;
甚至還可以加入其他變量
int a;
int b=2
a=b-1;

讓我們來個運用變量的程序
#include <stdio.h>
viod main()
{
      int a;
     float b;
     char c;
     a=1;
     b=1.1;
     c='a';
}   
把變量的值打印到屏幕上但是這個程序現(xiàn)在還沒有什么實質性的作用,變量賦值以后你無法從電腦中看到
所以,接下來我們學習printf()函數,我們把變量的值打印到屏幕上.
簡單來說,printf()就是在屏幕上產生輸出,把字符,數字,字符串發(fā)送到屏幕上

printf()的格式
printf(“”);可以直接輸出引號里的東西
printf(“%d”,a)這樣是直接輸出變量int類型a的值

%d的意思:d是decimal base(十進制)的開頭字母,意思就是按十進制格式輸出,也就是按整數格式輸出
還有%f    按浮點數格式輸出
%c    按字符格式輸出

printf(“%d”,a)的逗號后面只能放值,變量名可以,單純的值也可以,例如這樣printf(“%d”,1),也是可以的
連續(xù)輸出值可以這樣printf(“%d,%f,%c”,a,b,c),引號里的逗號不打也沒關系所以printf(“%d%f%c”,a,b,c)也是可以的,但是這樣會擠成一堆,自己試下就知道了,所以建議大家養(yǎng)成打逗號的習慣.

那么怎么進行回車?這就需要\n了,\n是轉義符,意思就是它能把你不能用字符打出來的東西,換種形式出來,在程序過程,你不可能中途又去按回車鍵.
轉義符還有很多個,例如\t,\\,\*\a
\n只是其中一個,其他的等用的時候在介紹吧,反正常用的也就一兩個
大家就只要牢記\n這一個,記住是反斜號,n是new-line (新的一行)的開頭字母。
因為float 定義的變量小數(浮點數)默認小數點后面保留6位數,那怎么讓它輸出1.1?

只讓讓%f變成%.1f就可以了,反之你想讓它輸出小數點后兩位數就%.2f,三位就%.3f,以此類推。
其實轉化字符不止%d %c %f等,字符串也有一個,就是%s string(字符串)的開頭字母,但是用的少
盡管只打印字符串時可以不需要%S,但是當打印與其他數據組合的字符串時,就可能需要用%S
例如:
printf("%s %d %f %c","hello",14,7.2,'a');
打印結果如下
hello 14 7.200000 a

%s %d %f %c 這些是轉化符,注意不能放到引號外,打印時要適當隔開,可以用空格或逗號隔開。

在程序運行過程中,手動用鍵盤輸入變量的值能在程序中打印變量的值了,但也只能打印我們事先在程序中寫好的值,能不能在程序過程中自己手動用鍵盤輸入變量的值,在打印出來呢?答案是肯定的

這時我們就要學習scanf()這個函數

一般在程序中,printf()和scanf()是一起使用的

scanf()的功能是從鍵盤獲取數據,同樣它也會用到轉化字符%d,%f,%c

scanf()的格式如下

scanf("%d",&a);

讓我們再看看printf();

printf("%d",a);

兩個差不多把,只不過scanf()比printf()多了一個&,&是什么?&是取地址符

scanf("%d",&a);意思就是你從鍵盤輸入一個整型變量的值,它會自動存到變量a那個地址,也就是它會找到那么標記為a的盒子,然后把值放進里面

為什么printf()沒&,因為它是直接輸出,a變量的地址已經事先知道,而scanf() 變量a的值從外部獲取,得先知道變量a的地址,知道地址你才好把值放進去

每個變量名都有對應的地址,變量名只是地址的別名,就好像外號一樣,之所以用變量名而不用地址名,因為變量名比地址名好記,方便,而地址名是數字,你不可能知道什么是什么

扯遠了,內存地址在學指針的時候你就會知道,現(xiàn)在先別管這些,知道太細反而越弄越糊涂,你現(xiàn)在就只需要知道scanf()的格式
scanf("%d",&a);

和print()差不多,但是變量名前一定要加&,除了scanf("%s",a);字符串格式就不需要,這也跟指針有關系,現(xiàn)在先別管,你只要知道除了%S,其他類型的變量都要在前面加&, 引號里面注意不要加\n,沒必要

連續(xù)輸入也是可以的,scanf("%d,%f",&a,&b);但目前先不要用

下面我們來個輸入(scanf)輸出(printf)的程序

#include <stdio.h>
void main()
{
      int a;
      float b;
      char c;
      printf("請輸入a的值:");
      scanf("%d",&a);
      printf("請輸入b的值:");
      scanf("%f",&b);
      printf("請輸入c的值:");
      scanf("%c",&c);
      printf("a的值為:%d,b的值為:%f,C的值為:%c\n",a,b,c);
}   

這個是正確的嗎?你運行的時候你就會發(fā)現(xiàn),變量c沒辦法輸入了,程序直接結束
哪里有問題?
下面我們來分析
首先程序顯示 請輸入a的值:
我們輸入1,在按回車鍵
又會顯示    請輸入b的值:
我們輸入1.1 按回車
這時候程序就會顯示
請輸入c的值:a的值為:1,b的值為:1.100000,C的值為:

這是為什么?別忘了之前說過,空格和回車也是字符

開始輸入了1到了變量a里,按回車,繼續(xù)下一個輸入
又輸入了1.1到了變量b里
此時再按回車的話,就會被scanf接收了,因為變量c是字符格式,回車也是字符,自動存到變量c里

非字符變量,用scanf連續(xù)輸入,按空格或回車會等待下一個輸入
但是字符和字符串變量,scanf會直接接收空格和回車

怎么解決?在%c前面加一個空格,就是這樣scanf(" %c",&c);
實質:空格作為分隔符。
#include <stdio.h>
main()
{
      int a;
      float b;
      char c;
      printf("請輸入a的值:");
      scanf("%d",&a);
      printf("請輸入b的值:");
      scanf("%f",&b);
      printf("請輸入c的值:");
      scanf(" %c",&c);
      printf("a的值為:%d,b的值為:%f,C的值為:%c\n",a,b,c);
}   
這樣程序就能正常運行

所以不管什么變量類型,最好都在前面加個空格,會是一個好習慣

scanf()是格式化輸入函數,顧名思義,就是你在輸入時必須按照指定的格式輸入才行。
把scanf("%d  %d",&a,&b);改成scanf("%d,%d",&a,&b);中間加一個逗號
那么,再怎么輸入?
注意:輸入時,scanf()的雙引號中出現(xiàn)什么非格式說明符就打什么,無論出現(xiàn)什么你就照打什么。

先輸入1,再輸入,(逗號),再輸入2,最后回車。
就是這樣:1,2 回車

結果也是a=1,b=2,如果輸入1就回車,那么b的值就沒辦法獲取,而是你想不到的結果(這個自己去運行)。

\n在前面和中間你可以無視,但是如果是在后面scanf("%d%d\n",&a,&b);
就必須這樣打了,輸入1 回車,輸入2,回車,輸入任何一個或多個字母,數字或字符最后回車
結果就是正確的 a=1,b=2
原因:此時輸入數據用轉義符結尾,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個東西(隨便一個或多個字母,數字,字符)。這里的空白符包括:空格,制表符,換行符,回車符和換頁符。
就是說scanf()里面多了個\n,scanf會跳過你輸入后按的回車鍵或空格鍵,再讀取一個東西,直到沒地方存儲才會結束scanf
注意空格也包括scanf("%d%d   ",&a,&b); 和\n一樣的道理,要多加小心
所以說\n根本沒必要在scanf里

我們在改scanf("%c%c",&a,&b);變scanf("%c,%c",&a,&b);加逗號
這個和非字符變量一樣,也是輸入 x,y 回車
結果是a=x,b=y

在改成空格,scanf("%c%c",&a,&b);字符變量這回是可以打空格也可以不打
輸入x y(中間空多少格都沒關系)回車 或者xy 回車
結果a=x,b=y

值得注意是scanf("%c%c",&a,&b);這種情況可千萬不要打空格,不然空格的值會傳到變量b里

補充:scanf("a=%d,b=%d,c=%d",&a,&b,&c);
輸入應為:
a=1,b=2,c=3 回車
跟我上面說的照打原理一樣



下面我們來說說注釋,就是解釋說明
電腦能夠理解你的程序,然后,其他人或許也會讀你的程序,另外,你會經常修改程序,如果程序非常龐大,你可能不記得你之前寫的東西有什么功能,別人看了沒有注釋的代碼也很難知道是什么意思

如果你寫的程序只是你自己使用,就不需要注釋了嗎?不是的,即使你當時懂,但過后很久,你也有可能會看不懂,所以,給程序加注釋是非常好的習慣

注釋怎么用?注意:我們加注釋不是給電腦看的,而是給我們人看的,電腦會無視我們的注釋,不會運行

#include <stdio.h>
void main()
{
      printf("hello world\n");   /*打印hello world*/
}   

/*.....*/    這就是注釋的第一種格式

#include <stdio.h>
main()
{
      printf("hello world\n");   //打印hello world
}   

// 這是注釋的第2種格式

顯然第2種比較好打

接下來我們來學習數組吧盡管C語言沒有字符串變量(字符串知道是啥吧)
但仍然有辦法存儲字符串,那就是用數組(array)
數組是一種特殊的變量類型
所有的數據類型int,float,char等,都有對應的數組類型
數組只不過是具有形同數據類型的許多變量的一個列表而已

說不多說,怎么定義一個數組?

char a[12]; 這就是定義了一個字符型的數組

跟普通定義變量而言,它只是多了個方括號,方括號里的數字代表的是數組里所存儲的字符長度(就是有多少個字符)

比如
char a[3]={'a','b','c'}   這是純字符數組

數組是有下標的,表示是哪個字符存放在哪個數組變量
下標都是從0開始的
a[0]='a',a[1]='b',a[2]='c' 注意這里就沒有a[3]了哈

a[0],a[1],a[2]其實就是變量,跟平時的變量a,b,c沒什么區(qū)別,只不過變量名是個死東西,不能改變,它們的值是可以改變的

例如
char a[3]={'a','b','c'};
a[0]='b';

打印出來的數組就是b,b,c了

還有
char a[4]="abc";

為什么明明是3個字符,寫著卻是4?
其實就個數組就是存儲的字符串,多出的字符是什么,就是‘\0',叫做NULL零,當然還有別的叫法
C語言用字符串結尾的'\0'來識別字符串的結束,在內存中,只有當c程序遇到null零時猜知道字符串結束了

當然也可以這樣存儲
char a[4]={'a',"b","c",'\0'}這就代表它存儲的是字符串

也可以不寫長度
char a[]="abc";   

記住你所存儲的數據所超過長度,會報錯的。

下面我們來輸入一個字符串,在打印出來

因為我們還不知道輸入字符串是多少字符,所以盡量定義的長度大一點


首先定義了個字符數組變量 char a[50];長度50,也就是可以容納50個字符變量

怎么用scanf()輸入? scanf(" %s",a); 就可以了,為什么沒有&,我前面已經說過了哦,跟指針有關系,等你學了才會知道,記住只有%S 格式可以不需要&哦

下面我們開始程序

#include <stdio.h>
main()
{
      char a[50];
      printf("請輸入一個字符串\n");
      scanf(" %s",a);
      printf("字符串為:%s\n",a);
}   

我們輸入hello 結果顯示字符串為:hello

但如果我們輸入hello world 結果也顯示字符串為:hello

因為有個空格,scanf()在%c字符格式會接收空格(空格也是字符)
但在字符串格式%s中 scanf()遇到空格、回車和Tab鍵都會認為輸入結束
那怎么讓字符串輸入包含空格,那也是我們下面的內容了。







其他輸入輸出函數除了printf()和scanf()函數,C語言還有其他輸入輸出函數,并且他們提供了一些printf()和scanf()沒有的功能
我們老學輸入輸出干什么,別急,這些輸入輸出函數將是我們以后將要用到的
我們目前只學6個
putchar()和getchar()
putch()和getch()
puts和gets()


putchar()是輸出函數,看它的英文名很容易明白,是跟字符有關的,它的功能是把一個字符打印到屏幕
只能一次打一個字符 putchar('a');
屏幕上出顯示一個字符a

打印字符變量的時候不需要引號
這點要比printf()好 printf()需要這樣打印printf("%c",a);

下面程序是putchar()和printf()分別打印字符變量a
#include <stdio.h>
main()
{
     char a='x';
     putchar(a);
     putchar('\n');

      printf("%c\n",a);

}   

可見putchar()打印字符變量是非常方便的,但用它直接打字符是非常愚蠢的行為,還不如用printf()
但是putchar()一次只能打印一個字符,它的用處會在以后的程序中逐步體現(xiàn),瞧著吧



getchar()函數的功能是輸入一個字符(就是從鍵盤獲取一個字符),和putchar()是對應的

怎么從鍵盤獲取一個字符?這樣嗎?
char a;
getchar(a);

這是錯的!!
正確獲取是這樣
char a;
a=getchar();

當你從鍵盤按下一個字符,它就會自動存到變量a里,可以理解為a的值等于你按下的某個鍵的值,記住括號里不要放東西
顯然這種輸入比scanf("%c",&a) 方便多了,但也只是對于輸入一個字符來說方便,scanf可以連接輸入,而getchar一次只能輸入一個字符。
盡管getchar()只獲取一個字符,但當你在鍵盤按下一個鍵后,那個字符并不是馬上被getchar()獲取,而是到了緩沖區(qū)里,緩沖區(qū)是一塊為輸入預留的內存區(qū)域,緩沖區(qū)不會釋放,直到你按下回車,緩沖區(qū)里的內容才一次一個字符的方式釋放,這好比你寄東西給你朋友,郵局就相當于緩沖區(qū),郵局向你征詢要不要確定寄出去,在你確定之前你如果后悔又可以拿回自己的東西,所以你在輸入字符的時候還可以用退格鍵重新修改或不再輸入,而回車既等于確定卻又是一個字符,回車自己本身也會進入緩沖區(qū)



下來來個例子

#include <stdio.h>
main()
{
     char a,b;
     a=getchar();
     b=getchar();
     putchar(a);
     putchar(b);
}   

我們輸入x-回車-y-回車

結果會是xy嗎?不是的結果是a=x b='\n'(回車)

當我們開始打x的時候,x在緩沖區(qū),當我們按下回車的時候,第一個getchar()才獲取到x這個值 順利存到a里    但回車既是確定又是字符,回車'\n'它也跟著進了緩沖區(qū),并且和x一起被釋放,x到了程序里 回車('\n')也到了程序里,并且被第2個 getchar()獲取,此時我們輸入y,這時緩沖區(qū)里有一個字符 'y', 然后我們又按下回車,'y'和'\n'又一起準備被釋放,由于程序里沒有第3個getchar(),所以'y'和'\n'還留在緩沖區(qū),但它們兩個已經是在準備狀態(tài)中,如果程序又出現(xiàn)一個getchar(),'y'不需要你按回車它會直接進入到第3個getchar(),getchar()是依次獲取,按先后順序,不會先獲取'\n',而'\n'正等待著馬上進入第4個getchar()



下面這個程序很好的說明了這個問題

#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);
   
}   

總結來說,當你輸入x '\n'(回車)    這兩個字符已經同時從緩沖區(qū)釋放了出來,被兩個getchar()分別獲取,‘\n’(回車)它進入緩沖區(qū)后會連同自己帶著'x'又馬上一起出來      輸入 y '\n'(回車)    這兩個字符也被同時釋放,被其他的getchar()分別獲取。

第2種解決辦法就是我們接下來要學的輸入輸出函數

那就是getch()和putch()函數,其實用法和putchar()和getchar()是一樣的

不過用之前我們得在程序最上面需要加上#include<conio.h>這個頭文件,因為只有這個頭文件包含這兩個函數

這兩個也是輸入輸出一個字符,但它們不再有緩沖區(qū)的概念,就是你不再需要按回車在確定了,你輸入什么它會直接進入程序里,且不等你的回車

#include <stdio.h>
#include <conio.h>
main()
{
     char a,b;
     a=getch();
     b=getch();

     putchar(a);
     putchar(b);
}   

當你輸入xy 不需要按回車,等你輸入完之后它會立即顯示到屏幕上
也就是你輸入x立馬就進入程序被第一個getch()獲取,輸入y立馬被第2個getch()獲取,不再進入緩沖區(qū)等待回車來確定
不過你在輸入的時候,屏幕上不會顯示你正在輸入的東西,也就是一片空白,直到你完成輸入它就會直接顯示結果
如果你要在屏幕上顯示你正在打的東西,就需要用putch()函數。

getch()也能接收回車,不過是'\r',return的開頭,即回到當前行的行首,\n是換行,回車其實是兩個字符一起,分別是\r,\n。\r是回車,即回到當前行的行首,\n是換行,兩個效果合起來就是我們所熟悉的到下一行開頭。
getchar()接收回車 首先接收到"\r"會去讀緩沖區(qū),如果緩沖區(qū)沒有東西,它會開始等待,直到'\n'過來了,然后'\n'就進到緩沖區(qū)里,被getchar()獲取,至于'\r',它不會進緩沖區(qū)
而getch() 沒緩沖區(qū),它接收到的第一個字符就是'\r'
之所以把'\n'稱做回車,是讓大家便于理解,但'\n'不完全等于回車,它其實是換行

好像越說越復雜了,看不懂也沒關系,你現(xiàn)在只要知道getch()按回車并不是接收'\n'就可以了,那些以后會慢慢懂的

getch()自己本身也是值
所以printf("%c",getchar());也可以,和getchar()一樣

getch()有個缺點,因為沒緩沖區(qū)的關系,你輸入的時候就不能在修改了,緩沖區(qū)相當于草稿,但它的優(yōu)點就是不需要回車來確定了

有點用途大家很熟悉 就是程序需要你按(Y/N)的時候
按Y繼續(xù),按N退出,這時直接按Y或N就可以了,而不需要再按一次回車

這里大家只要了解getch()函數就可以了 putch()基本不用的。

puts()和gets()輸出輸入函數接下來我們學習puts()和gets()輸出輸入函數,這兩個函數提供了一種更容易的方法來打印和獲取字符串

下面定義一個字符數組

char a[50];
用gets()獲取字符串 gets(a);
然后用puts()打印字符串 puts(a);

get是獲取的意思,從鍵盤獲取值,gets()既能獲取一個字符也能獲取多個字符,也就是字符串,它能獲取到帶空格的字符串,自動在末尾加上NULL零,這都正是我們想要的
puts()能打印一個字符也能打印字符串,而且在打印后面會自動換行(加個'\n',不過你看不到)
puts()也能直接打印 puts("hello world"); 并且自動換行,不需要打'\n'

下面這個程序
#include <stdio.h>
main()
{
       char a[50];
       puts("請輸入一個字符串");
       gets(a);
       puts(a);     
}   
輸入hello world就能順利輸出hello world了

gets()既能獲取單個字符,又能獲取到帶空格的字符串,并且自動在字符串末尾加上NULL零
puts()既能打印單個字符,又能直接輸出任何字符格式,并且自動換行


有了puts(),gets()我們是不是可以拋棄printf() scanf() putchar()getchar()?
答案是否定的,這就需要介紹3者各自的功能
printf()和scanf()是格式輸出輸入函數,最后的f是format(格式)的意思

putchar() getchar() 輸出輸入函數只針對單個字符的操作

puts(),gets() 輸出輸入函數可以單個字符操作(但是功能有限的),主要是針對字符串操作


下面我們定義
int a

用scanf("%d",a)可以獲取整型a的值,a=getchar(),gets(a)無法從鍵盤獲取數字
用printf("%d",a)可以打印數字a的值,putchar(a),puts(a)沒法打印
數字方面: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()敗

補充:puts()和gets()能接收和打印單個字符只限制變量是數組變量
可見scanf()和printf()什么都能實現(xiàn),但對字符和字符串操作沒有其他兩種好
getchar()和putchar()對字符操作優(yōu)勢明顯,但不能操作數字變量,字符數組變量
gets()和puts()對字符串操作優(yōu)勢明顯,但也不能操作數字變量,字符變量

scanf()和printf()格式輸入輸出能同時按格式一起輸入輸出字符,數字,字符串
這是其他兩種不能比的

所以程序以scanf()和printf()為主,其他兩種作為輔助,發(fā)揮各自的長處
如果大家還對這些感到暈的話,也不要急,它們各自的功能將會在以后的程序中完全體現(xiàn)出來,你也會更容易理解.

另外我在說一下緩沖區(qū)的問題,是針對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是能接收空格和回車(既是確定又是字符)的
當輸入x 回車兩個同時被釋放,被變量a,b分別獲取
輸入y 回車    y被釋放,回車準備釋放狀態(tài),y被c獲取

和getchar()緩沖區(qū)原理一樣把
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);
}   
上面輸入x 回車兩個同時被釋放 x被a獲取 回車到了第2個scanf的那個空格里
輸入y 回車 y被b獲取回車到了第3個scanf那個空格里
輸入z 回車 z被c獲取回車則是準備釋放狀態(tài)中

scanf("%s",a);,gets(a)遇到回車和空格

scanf("%s",a);以遇到空格為輸入結束的標志(前提是緩沖區(qū)有值),值還在緩沖區(qū)等回車來確定釋放,但%s格式不會讓回車和空格進入緩沖區(qū),也不會讓空格和回車存入%s格式的a里
scanf("%s",a);遇到回車結束和釋放同時進行,回車不進入緩沖區(qū)

gets(a),以遇到回車為結束的標志,不管緩沖區(qū)有沒有值,遇到回車馬上結束,回車不進入緩沖區(qū)
gets(a);遇到空格等于遇到字符,沒特殊含義

scanf("%c",&a);,a=getchar()遇到回車和空格

scanf("%c",&a);,遇到空格會直接被a獲取,然后進入緩沖區(qū)等待回車,回車也進入緩沖區(qū)和緩沖區(qū)的值一起釋放
scanf("%c",&a);,遇到回車也會直接被a獲取,且同時和回車一起從緩沖區(qū)釋放

a=getchar()原理和scanf("%c",&a);,一樣 因為scanf("%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先進入緩沖區(qū),再按回車 a1b4和回車一起釋放,scanf()函數本質上是一種"模式匹配"函數,首先第一個 scanf()讀取緩沖區(qū)里的數據 %c格式只能保存一個字符,所以a被第一個scanf()拿走了,1b4繼續(xù)留在緩沖區(qū),接著第2個scanf()讀取,%d格式獲取1成功,但獲取到b時,由于格式不匹配,放棄b ,由于%d已經獲取了一個數字,所以4也放棄了, b4和回車就繼續(xù)留到緩沖區(qū)里準備釋放中

好了,緩沖區(qū)內容告一段落!


最后來個總結,用程序表示
#include <stdio.h>
main()
{
     char a,b[50];
     printf("請輸入第一個字符:\n");
     scanf(" %c",&a);
     getchar();        //獲取前面的回車
     printf("第一個的字符為:%c\n",a);

   
     printf("請輸入第二個字符:\n");
     a=getchar();
     printf("第二個字符為:");
     putchar(a);
     putchar('\n');

     printf("請輸入第一個字符串:\n");
     scanf(" %s",&b);
     getchar();        //獲取前面的回車
     printf("第一個的字符為:%s\n",b);

     puts("請輸入第二個字符串:");
     gets(b);
     puts("第二個字符串為:");
     puts(b);
}   

上面那幾種輸入輸出函數應該都知道怎么用了吧
還有緩沖區(qū),應該也知道個大概了吧,我可能說的不夠詳細,沒辦法讓你真正了解,不過沒關系,以后我們會對緩沖區(qū)進行全方位的了解,還會學到清空緩沖區(qū)的方法,這里你們主要該掌握一些基本的輸入輸出函數的用法,以及注意緩沖區(qū)留下來的回車

好了,輸入輸出介紹完畢

完整的Word格式文檔51黑下載地址:
從零開始學 -C語言-1.doc (78.5 KB, 下載次數: 25)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:223999 發(fā)表于 2018-12-29 09:40 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:433680 發(fā)表于 2019-1-3 13:44 | 顯示全部樓層

感謝樓主分享的好資料
回復

使用道具 舉報

ID:199814 發(fā)表于 2019-1-3 19:52 | 顯示全部樓層
學習學習。
回復

使用道具 舉報

ID:461436 發(fā)表于 2019-1-3 23:21 來自手機 | 顯示全部樓層
喜歡正適合我們這些新手的學習,大愛樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清不卡毛片 | 亚洲综合一区二区三区 | 日韩av在线中文字幕 | 午夜影院官网 | 日本色综合 | 国产一级淫片a直接免费看 免费a网站 | 欧美久久久久 | 人人操日日干 | 精品视频一区二区三区 | 看片一区| 暖暖成人免费视频 | 国产精品久久久99 | 亚洲在线高清 | 亚洲欧美综合精品久久成人 | 色播视频在线观看 | 国产精品久久久久久吹潮 | 成人国产免费视频 | 91毛片在线看 | 青青草网站在线观看 | 六月成人网 | 亚洲资源在线 | 欧美综合一区二区三区 | 欧美日韩国产一区二区三区 | 在线观看黄色大片 | 激情综合五月 | 日韩久草 | 欧美日韩一区在线播放 | 国产一区二区三区免费观看视频 | 一区二区三区免费观看 | 国产精品特级毛片一区二区三区 | 成人性视频免费网站 | 精品欧美黑人一区二区三区 | 中文字幕免费在线 | h视频在线播放 | 亚洲精品久久久久久久久久久 | 国产精品一区二 | 国产在线播放av | 久久久久久国产精品免费 | 91精品国产手机 | 一级欧美一级日韩片 | 欧美成人精品在线观看 |