日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言复习(1)

發布時間:2025/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言复习(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言從鍵盤輸入數據



程序是人機交互的媒介,有輸出必然也有輸入。在C語言中,有多個函數可以從鍵盤獲得用戶輸入:
scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。
getchar()、getche()、getch():這三個函數都用于輸入單個字符。
gets():獲取一行數據,并作為字符串處理。


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


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



#include <stdio.h>
#include <stdlib.h>
int main()
{
? ? int a, b, c, d;
? ? scanf("%d", &a); ?//輸入整數并賦值給變量a
? ? scanf("%d", &b); ?//輸入整數并賦值給變量b
? ? printf("a+b=%d\n", a+b); ?//計算a+b的值
? ? scanf("%d %d", &c, &d); ?//輸入兩個整數并分別賦值給c、d
? ? printf("c*d=%d\n", c*d); ?//計算c*d的值
? ? system("pause");
? ? return 0;
}
運行結果:
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 <stdio.h>
#include <stdlib.h>
int main()
{
? ? int a='F';
? ? int b=12;
? ? int c=452;
? ? printf("&a=%#x, &b=%#x, &c=%#x\n", &a, &b, &c);
? ? system("pause");
? ? return 0;
}
輸出結果:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40


圖:a、b、c 的內存地址
注意:你看到的地址是虛擬地址,并不等于它在物理內存中的地址。虛擬內存是現代操作系統因內存管


理的需要才提出的概念,dos 下沒有這個概念,用戶看到的都是真實的地址。CPU 操作的是物理內存地


址,所以虛擬地址必須經過轉換才能交給 CPU,這是 OS 的工作,對用戶是透明的。
再來看一個 scanf 的例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
? ? int a, b, c;
? ? scanf("%d %d", &a, &b);
? ? printf("a+b=%d\n", a+b);
? ? scanf("%d ? %d", &a, &b);
? ? printf("a+b=%d\n", a+b);
? ? scanf("%d, %d, %d", &a, &b, &c);
? ? printf("a+b+c=%d\n", a+b+c);
? ?
? ? scanf("%d is bigger than %d", &a, &b);
? ? printf("a-b=%d\n", a-b);
? ? system("pause");
? ? return 0;
}
運行結果:
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 <stdio.h>
#include <stdlib.h>
int main()
{
? ? char c;
? ? c=getchar();
? ? printf("c='%c'\n", c);
? ? system("pause");
? ? return 0;
}
運行結果:
#↙
c='#'


你也可以將第5、6行的語句合并為一個:
char c = getchar();


getche() 使用示例:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
? ? char c=getche();
? ? printf("c='%c'\n", c);
? ? system("pause");
? ? return 0;
}
運行結果:
#c='#'


大家親自運行程序會發現,剛輸入字符 #,getche() 就立即獲取,不會等到用戶按下回車鍵,所以運行


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


換行。


getch() 使用示例:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
? ? char c=getch();
? ? printf("c='%c'\n", c);
? ? system("pause");
? ? return 0;
}
運行程序,輸入 #,結果為:
c='#'


大家親自運行程序會發現,getch() 和 getche() 類似,輸入一個字符就立即獲取,不會等待用戶按下


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


在C語言中,將用戶輸入的內容顯示在屏幕上叫做回顯(Echo)。getchar()、getche() 是有回顯的,而?


getch() 沒有回顯。


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


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


另外需要注意的是:getchar() 位于 stdio.h 頭文件中,是C語言規定的標準函數;而 getche()、


getch() 位于 conio.h 中,它們都不是標準函數,不保證在任何編譯器下都有效。
輸入字符串


這里由于大家的基礎知識還不夠,沒有學到數組和指針,暫時無法深入講解。下面僅作一個演示:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
? ? char str1[30], str2[30]; ?//定義兩個字符數組
? ? gets(str1);
? ? scanf("%s", str2);
? ? puts(str1);
? ? puts(str2);
? ? system("pause");
? ? return 0;
}
運行結果:
The world is beautiful!↙
Hello World!↙
The world is beautiful!
Hello


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


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

C語言關系運算符



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


用,兒童因為年齡不夠,沒有權限使用。這時候程序就需要獲取用戶輸入的年齡并做出判斷,如果超過


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<c
4) -i-5*j==k+1


關系運算符也可以嵌套使用,例如:
1) a>(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 <stdio.h>
int main(){
? ? char c='k';
? ? int i=1, j=2, k=3;
? ? float x=3e+5, y=0.85;
? ? int result_1 = 'a'+5<c, result_2 = x-5.25<=x+y;
? ? printf( "%d, %d\n", result_1, -i-2*j>=k+1 );
? ? printf( "%d, %d\n", 1<j<5, result_2 );
? ? printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 );
? ? return 0;
}
運行結果:
1, 0
1, 1
0, 0


對于含多個關系運算符的表達式,如 k==j==i+5,根據運算符的左結合性,先計算k==j,該式不成立,


其值為0,再計算0==i+5,也不成立,故表達式值為0。
========

C語言共用體(共同體)



共用體(共同體)的定義和結構體類似,不過結構體的各個成員都會分配相應的內存空間,而共用體的


所有成員共享一段內存,它們的起始地址一樣,并且同一時刻只能使用其中的一個成員變量。
共用體在實際開發中應用較少,你可以暫時跳過,需要時再來溫習。
共用體定義的一般格式為:
union 共用體名{
? ? 成員列表
};
例如:
//先定義共用體,再定義變量
union data{
? ? int i;
? ? char ch;
};
data a, b, c;
或者:
//定義共用體的同時定義變量
union data{
? ? int i;
? ? char ch;
} a, b, c;
共用體所占用的內存空間大小等于最長的成員所占用的字節數。共用體使用了覆蓋技術,幾個成員變量


相互覆蓋,從而使幾個不同變量共占同一段內存。這也就意味著,同一時刻只能存放一個成員變量的值


,只能有一個成員存在,不可能像結構體一樣同時存放。如果對新的成員變量賦值,就會把原來成員變


量的值覆蓋掉。


共用體 data 中,成員 i 所占用的空間最大,為 4 個字節,所以 data 類型的變量(也就是a、b、c)


也占用4個字節的內存。請看下面的例子:
#include <stdio.h>
union{
? ? int i;
? ? char c;
}a;
int main(){
? ? printf("Size of a: %d\n", sizeof(a));
? ? a.c='A'; ?//此時共用體變量4個字節的取值情況為0x00000041
? ? printf("a.i = %d\n",a.i);
? ? a.i=0x42; ?//0x42為字母B的ASCII碼
? ? printf("a.c = %c\n",a.c);
? ? return 0;
}
運行結果:
Size of a: 4
a.i = 65
a.c = B


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



========

總結

以上是生活随笔為你收集整理的C语言复习(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。