C語言複習 1

2021-07-13 23:09:38 字數 4624 閱讀 9508

程式是人機互動的媒介,有輸出必然也有輸入。在c語言中,有多個函式可以從鍵盤獲得使用者輸入:

scanf():和 printf() 類似,scanf() 可以輸入多種型別的資料。

getchar()、getche()、getch():這三個函式都用於輸入單個字元。

gets():獲取一行資料,並作為字串處理。

scanf() 是最靈活、最複雜、最常用的輸入函式,但它不能完全取代其他函式,大家都要有所了解。

scanf()函式

scanf 是 scan format 的縮寫,意思是格式化掃瞄,也就是從鍵盤獲得使用者輸入。我們先來看乙個例子

:#include

#include

int main()

執行結果:

12↙60↙

a+b=72

10 23↙

c*d=230

↙表示按下回車鍵。

從鍵盤輸入12,按下回車鍵,scanf() 就會讀取輸入資料並賦值給變數 a,本次輸入結束,執行下一條

語句。接著給變數b賦值,也是同樣的道理。

第9行**中,我們同時輸入兩個整數並分別賦值給c、d。注意"%d %d"之間是有空格的,所以輸入資料

時也要有空格。也就是說,輸入資料的格式要和控制字串的格式一致。

scanf 和 printf 非常相似:

scanf("%d %d", &a, &b);  // 獲取使用者輸入的兩個整數,分別賦值給變數 a 和 b

printf("%d %d", a, b);  // 將變數 a 和 b 的是在顯示器上輸出。

它們都有格式控制字串,都有變數列表。不同的是,scanf 的變數前要帶乙個&符號;&稱為取位址符

,也就是獲取變數在記憶體中的位址。

在《二進位制思想以及資料的儲存》一節中講到,資料是以二進位制的形式儲存在記憶體中的,位元組(byte)

是最小的可操作單位。為了便於管理,我們給每個位元組分配了乙個編號,使用該位元組時,只要知道編號

就可以,就像每個學生都有學號,老師會隨機抽取學號來讓學生回答問題。位元組的編號是有順序的,從 

0 開始,接下來是 1、2、3……

下圖是 4g 記憶體中每個位元組的編號(以十六進製制表示):

這個編號,就叫做位址(address)。int a;會在記憶體中分配四個位元組的空間,我們將第乙個位元組的位址

稱為變數 a 的位址,也就是&a的值。對於前面講到的整數、浮點數、字元,都要使用 & 獲取它們的地

址,scanf 會根據位址把讀取到的資料寫入記憶體。

#include

#include

int main()

輸出結果:

&a=0x18ff48, &b=0x18ff44, &c=0x18ff40

理的需要才提出的概念,dos 下沒有這個概念,使用者看到的都是真實的位址。cpu 操作的是物理記憶體地

址,所以虛擬位址必須經過轉換才能交給 cpu,這是 os 的工作,對使用者是透明的。

再來看乙個 scanf 的例子:

#include

#include

int main()

執行結果:

10    20↙

a+b=30

100 200↙

a+b=300

56,45,78↙

a+b+c=179

25 is bigger than 11↙

a-b=14

第乙個 scanf() 的格式控制字串為"%d %d",中間有乙個空格,而我們卻輸入了10    20,中間有多

個空格。第二個 scanf() 的格式控制字串為"%d   %d",中間有多個空格,而我們卻輸入了100 200,

中間只有乙個空格。這說明 scanf() 對輸入資料之間的空格的處理比較寬鬆,並不要求空格數嚴格對應

。第三個 scanf() 的控制字串為"%d, %d, %d",中間以逗號分隔,所以輸入的整數也要以逗號分隔。

第四個 scanf() 要求整數之間以is bigger than分隔。

每次使用者按下回車鍵,程式就會認為使用者輸入結束,scanf() 開始讀取使用者輸入的內容,並根據格式控

制字串從中提取資料,只要使用者輸入的內容和格式控制字串匹配,就能夠正確提取。

本質上講,使用者輸入的內容都是字串,scanf() 完成的是從字串中提取有效資料的過程。

輸入單個字元

scanf 用於接收使用者輸入的各種資料,如果僅僅是輸入單個字元,也可以使用 getchar()、getche() 或 

getch()。

getchar() 使用示例:

#include

#include

int main()

執行結果:

#↙c='#'

你也可以將第5、6行的語句合併為乙個:

char c = getchar();

getche() 使用示例:

#include

#include

#include

int main()

執行結果:

#c='#'

大家親自執行程式會發現,剛輸入字元 #,getche() 就立即獲取,不會等到使用者按下回車鍵,所以執行

結果中沒有換行。而 getchr() 不是,它要等到使用者按下回車鍵才能確認輸入結束,所以執行結果中有

換行。getch() 使用示例:

#include

#include

#include

int main()

執行程式,輸入 #,結果為:

c='#'

大家親自執行程式會發現,getch() 和 getche() 類似,輸入乙個字元就立即獲取,不會等待使用者按下

回車鍵。與 getche() 不同的是,getch() 輸入的 # 並沒有顯示出來。

在c語言中,將使用者輸入的內容顯示在螢幕上叫做回顯(echo)。getchar()、getche() 是有回顯的,而 

getch() 沒有回顯。

回顯在大部分情況下是有必要的,它能夠與使用者及時互動,讓使用者清楚地看到自己輸入的內容。但在某

些特殊情況下,我們卻不希望有回顯,例如輸入密碼,有回顯是非常危險的,容易被**。

另外需要注意的是:getchar() 位於 stdio.h 標頭檔案中,是c語言規定的標準函式;而 getche()、

getch() 位於 conio.h 中,它們都不是標準函式,不保證在任何編譯器下都有效。

輸入字串

#include

#include

#include

int main()

執行結果:

the world is beautiful!↙

hello world!↙

the world is beautiful!

hello

gets() 會讀取使用者輸入的整行內容,包括空格。而 scanf() 遇到空格就結束讀取,也就是說,使用 

scanf() 讀取的字串中永遠不會包含空格。

*****===

在程式中經常需要比較兩個資料的大小,以決定程式下一步的工作。比如乙個程式限制了只能成年人使

用,兒童因為年齡不夠,沒有許可權使用。這時候程式就需要獲取使用者輸入的年齡並做出判斷,如果超過

18歲就正常執行,否則給出無權使用的提示。

比較兩個資料大小的運算子稱為關係運算子(relational operators)。

在c語言中有以下關係運算子:

1) <(小於)

2) <=(小於或等於)

3) >(大於)

4) >=(大於或等於)

5) ==(等於)

6) !=(不等於)

關係運算子都是雙目運算子,其結合性均為左結合。關係運算子的優先順序低於算術運算子,高於賦值運

算符。在六個關係運算子中,<、<=、>、>=的優先順序相同,高於==和!=,==和!=的優先順序相同。

在c語言中,有的運算子有兩個運算元,例如 10+20,10和20都是運算元,+ 是運算子。我們將這樣的運

算符稱為雙目運算子。同理,將有乙個運算元的運算子稱為單目運算子,將有三個運算元的運算子稱為

三目運算子。

常見的雙目運算子有 +、-、*、/ 等,單目運算子有 ++、-- 等,三目運算子只有乙個,就是 ? :,我

們將在《c語言條件運算子》中詳細介紹。

關係運算子的兩邊可以是變數、資料或表示式,例如:

1) a+b>c-d

2) x>3/2

3) 'a'+1(b>c)

2) a!=(c==d)

關係運算子的運算結果只有 0 或 1。當條件成立時結果為 1,條件不成立結果為 0。例如:

5>0 成立,其值為 1;

34-12>100 不成立,其值為 0;

(a=3)>(b=5) 由於3>5不成立,故其值為 0。

我們將運算結果 1 稱為「真」,表示條件成立,將 0 稱為「假」,表示條件不成立。

我們不妨將關係運算子的結果輸出看一下:

#include

int main()a;

int main()

執行結果:

size of a: 4

a.i = 65

a.c = b

兩個不能:不能使用共用體變數,只能引用共用體變數中的成員。不能在定義共用體變數時進行初始化

。*****===

C語言複習(1)

1.邏輯運算子的短路效應 邏輯運算子的短路效應 對於邏輯與 來說,同為真時才為真,所以當條件1為假時不需要計算條件2 對於邏輯或 來說,同為假時才為假,所以當條件1為真時不需要計算條件2 下面的運算形式為,先計算 a b 的結果,a為真,故再計算 b,結果也為真,所以表示式 a b 為真 對於 a ...

C語言基礎複習1

不改變其他位的值的狀況下,對某幾個位進行設值。這個場景微控制器開發中經常使用,方法就是先對需要設定的位用 操作符進行清零操作,然 後用 操作符設值。比如我要改變 gpioa odr 的狀態,可以先對暫存器的值進行 清零操作 gpioa odr 0xff0f 將第 4 7 位清 0 然後再與需要設定的...

C語言基礎複習 結構體 1

c語言允許使用者根據具體問題利用已有的基本資料型別來構造自己所需的資料型別 陣列是由相同型別的資料構成的一種資料型別,適用於對具有相同屬性的資料進行批量處理 結構體是將不同的資料成員組織到統一的名字之下,適用於對關係緊密 邏輯相關 具有相同或者不同屬性的資料進行處理 結構體變數的定義 1.定義結構體...