考試月來臨,劃水劃了大半學期,想起來我已經幾個月沒有打過C的代碼了,C語言是剛開學的時候自學的,學院下學期才開設C語言課程,上課的時候都在干自己的事情,現在快考試了,來整理順便復習一下C語言的相關內容吧~🍰

1. 程式設計和C語言
1.1 Hello world
#include <stdio.h> //預處理指令
int main() { //定義主函式
printf("這是一篇復習博客"); //輸出陳述句
return 0; //函式執行完畢
}
1.2 程式的結構
- 一個程式由一個或多個原程式檔案組成
- 函式是C程式的主要組成部分,函式是程式的基本單位
- 一個函式包括兩個部分,函式首部(
int max(int a, int b))和函式體(花括號中的部分) - 程式總是從
main函式開始執行,無論main函式在什么位置 - 程式中要求計算機的操作是由函式中的C陳述句完成的
- 在每個資料宣告和陳述句的最后必須有一個分號
- C語言本身不提供輸入輸出陳述句,是通過庫函式
scanf和printf提供的 - 程式應當包含注釋,注釋能大大的提升代碼的可讀性
對于長期打
js代碼的來說,分號真的是它容易忘記了!!
注意: 手寫代碼的時候一定要注意分號,以及注意雙引號
1.3 運行 C 語言的步驟
編輯-編譯-連接-執行
1.4 練習題
答案在習題后面噢~
第一題:
一個C程式的組成部分可以是( ),
A) 一個主函式和一至若干個其他函式 B) 一至若干個主函式
C) 一個主程式和一至若干個其他函式 D) 一個主程式和一至若干個子程式
第二題:
一個C程式的執行是從( ),
(A) 本程式的main函式開始,到main函式結束
(B) 本程式檔案的第一個函式開始,到本程式檔案的最后一個函式結束
? 本程式的main函式開始,到本程式檔案的最后一個函式結束
(D) 本程式檔案的第一個函式開始,到本程式main函式結束
第一題: A,第二題:A
2. 順序、選擇、回圈結構
2.1 識別符號
識別符號的命名規則是:
- 只能由字母、數字和下劃線組成,字母區分大小寫,
- 第一個字符必須是字母或下劃線,不能為數字,
C語言中識別符號有以下3類
- 關鍵字,它們在程式中有固定的含義,不能另作他用,如
int、for、switch等, - 預定義識別符號,預先定義并具有特定含義的識別符號,如
define、include等, - 用戶識別符號,用戶自定義識別符號,符合命名規則且不能與關鍵字沖突,
2.2 常量與變數
2.2.1 常量
常量是指在程式運行程序中,其值不能改變的量稱為常量,常見的常量有以下幾類:
- 整形常量:如
1000,12345,0,-345 - 實型常量:兩種形式,小數和指數(
123.456和12.34e3) - 字符常量:可以是一個普通的字符( 如
x)、一個轉義序列(例\t),或一個通用的字符(如\u02C0) - 字串常量:如
"boy","123"等,用雙撇號把若干字符括起來,字串常量是雙撇號里的全部字符 - 符號常量:用
define指令,指定用一個符號名稱代表一個常量,如#define PI 3.14結尾沒有分號
| 轉義序列 | 含義 |
|---|---|
| \ | \ 字符 |
| ’ | ’ 字符 |
| " | " 字符 |
| ? | ? 字符 |
| \a | 警告 |
| \b | 退格鍵 |
| \f | 換頁符 |
| \n | 換行符 |
| \r | 回車 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \o或\oo或\ooo其中o表示一個八進制數字 | 一到三位的八進制數 |
| \xh[h…] | 一個或多個數字的十六進制數 |
\ooo 是對用三位八進制數轉義表示任意字符的形象化描述,
例如
char ch = '\111';等價于char ch = 0111;(以0開頭的表示八進制)
2.2.2 變數
int a = 3;

注意:變數必須先定義后使用,在變數取值時,實際上是通過變數名找到相應的記憶體地址,從該存盤單元中讀取資料
2.2.3 練習題
第一題:
下列定義變數的陳述句中錯誤的是______,
A、int int B、double int
C、char For D、float US$
答案:D
第二題:
以下不合法的用戶識別符號是______,
A、j2_KEY B、Double
C、4d D、
_8_
答案:C
2.3 資料型別

2.3.1 整數型別

注意:
-
intshort intlong int是根據編譯環境的不同,所取范圍不同 -
int的取值范圍在于他占用的位元組數 ,不同的編譯器,規定是不一樣,
2.3.2 浮點型
浮點資料根據精度的不同分為3種

注意:C語言中不存在字串變數,字串只能存在字符陣列中
2.3.3 型別轉換
1. 自動型別轉換
自動轉換發生在不同資料型別運算時,在編譯的時候自動完成,
注意:
只有位元組小的可以向位元組大的自動轉換,不可逆
#include <stdio.h>
int main()
{
char c1, c2;
c1 = 'A';
c2 = c1 + 32;
printf("%c\n", c2); // a
printf("%d\n", c2); // 97
}
如上,自動的將c1轉化為ASCII碼再進行加法運算
2. 強制型別轉化
強制型別轉換是通過定義型別轉換運算來實作的,其一般形式為:
//(轉化型別)值
(double) a // 將a轉化成double型別
(int) (x + y) //將x+y轉化成int型別
如%運算子要求其兩側均為整型量,若x為float型,則x % 3不合法,則這時候就需要強制型別轉化了,(int)x % 3,因為強制型別轉換運算子優先于%運算,所以會先進行(int)x運算再進行取余運算
3. tips
-
轉換型別和運算式都必須加括號, 如把
(int)(x / 3 + y)寫成(int)x / 3 + y則成了把x轉換成int型之后再除3再與y相加了, -
強制轉換不存在四舍五入
-
強制型別轉換時,得到一個所需型別的中間資料,而原來變數的型別未發生變化
2.4 運算子和運算式
2.4.1 基本算術運算子
假定A = 10, B = 20
| 運算子 | 描述 | 實體 |
|---|---|---|
| + | 把兩個運算元相加 | A + B 將得到 30 |
| - | 從第一個運算元中減去第二個運算元 | A - B 將得到 -10 |
| * | 把兩個運算元相乘 | A * B 將得到 200 |
| / | 分子除以分母 | B / A 將得到 2 |
| % | 取模運算子,整除后的余數 | B % A 將得到 0 |
| ++ | 自增運算子,整數值增加 1 | A++ 將得到 11 |
| – | 自減運算子,整數值減少 1 | A-- 將得到 9 |
2.4.2 自增和自減運算子
自加運算子
++與自減運算子--是單目運算子,運算的物件是變數,自增自減運算有兩種一種前綴,一種后綴,兩種運算式的值是有區別的,前綴是:先運算再取值,后綴是:先取值后運算
如:
#include<stdio.h>
int main() {
int i = 3;
printf("%d",++i); // 4
}
又如:可以很清楚的理解!
#include<stdio.h>
int main() {
int i = 3;
printf("%d",i++); // 3
}
2.4.3 邏輯運算子
假設變數 A 的值為 1,變數 B 的值為 0
| 運算子 | 描述 | 實體 |
|---|---|---|
| && | 稱為邏輯與運算子,如果兩個運算元都非零,則條件為真, | (A && B) 為假, |
| || | 稱為邏輯或運算子,如果兩個運算元中有任意一個非零,則條件為真, | (A || B) 為真, |
| ! | 稱為邏輯非運算子,用來逆轉運算元的邏輯狀態,如果條件為真則邏輯非運算子將使其為假, | !(A && B) 為真, |
也就是說a并b有假則假,a或b有真則真
2.4.4 賦值運算子
簡單賦值運算子為=
int a = 3;// 給a賦值為3
復合賦值運算子就是在簡單賦值符之前加上其它運算子構成
例如+=、-=、*=、/=
a += 3;等價于 a = a + 3
注意:復合運算子中運算子和等號之間不存在空格,
2.4.5 關系運算子
假設變數 A 的值為 10,變數 B 的值為 20
| 運算子 | 描述 | 實體 |
|---|---|---|
| == | 檢查兩個運算元的值是否相等,如果相等則條件為真, | (A == B) 為假, |
| != | 檢查兩個運算元的值是否相等,如果不相等則條件為真, | (A != B) 為真, |
| > | 檢查左運算元的值是否大于右運算元的值,如果是則條件為真, | (A > B) 為假, |
| < | 檢查左運算元的值是否小于右運算元的值,如果是則條件為真, | (A < B) 為真, |
| >= | 檢查左運算元的值是否大于或等于右運算元的值,如果是則條件為真, | (A >= B) 為假, |
| <= | 檢查左運算元的值是否小于或等于右運算元的值,如果是則條件為真, | (A <= B) 為真, |
2.4.6 三目運算子
三目運算子的格式為:
運算式1 ? 運算式2 : 運算式3;
如果運算式1為真則值為運算式2,否則為運算式3
如:
#include <stdio.h>
int main()
{
int a = 10;
int b;
b = (a == 4) ? 1 : 2;
printf("b 的值是 %d\n", b); // b 的值是 2
}
2.4.7 運算子優先級
初等運算子的優先級別最高,然后是單目運算子、算術運算子、關系運算子、邏輯運算子(除邏輯非!)、條件運算子、賦值運算子、逗號運算子,大多數都是自左向右結合,而單目運算子、條件運算子和賦值運算子自右向左結合
運算子優先級及結合性匯總自上向下優先級降低
| 類別 | 運算子 | 結合性 |
|---|---|---|
| 后綴 | () [] -> . ++ - - | 從左到右 |
| 一元 | + - ! ~ ++ - - (type)* & sizeof | 從右到左 |
| 乘除 | * / % | 從左到右 |
| 加減 | + - | 從左到右 |
| 移位 | << >> | 從左到右 |
| 關系 | < <= > >= | 從左到右 |
| 相等 | == != | 從左到右 |
| 位與 AND | & | 從左到右 |
| 位異或 XOR | ^ | 從左到右 |
| 位或 OR | | | 從左到右 |
| 邏輯與 AND | && | 從左到右 |
| 邏輯或 OR | || | 從左到右 |
| 條件 | ?: | 從右到左 |
| 賦值 | = += -= *= /= %=>>= <<= &= ^= |= | 從右到左 |
| 逗號 | , | 從左到右 |
菜鳥教程中的運算子優先級
2.4.8 練習題
復習了這么多關于運算子的知識,來練幾道題吧
第一題:
#include <stdio.h>
int main()
{
int a = 1, b = 2, c = 4, d = 8;
int e;
e = (a + b) * c / d;
printf("e的值是 %d\n", e);
}
//輸出 :e的值是 1
第二題:
這題要好好思考噢
int main()
{
int x = 12, n = 5;
x %= (n % 2);
printf("%d", x);
}
// 輸出: 0
n % 2余數是1,12對1取余為0
第三題:
在C語言中,字符型資料在記憶體中的存盤形式是
A)原碼 B)補碼 C)反碼 D)ASCII碼
答案: D
第四題:
若執下面程式時從鍵盤上輸入5,
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
if(x++ > 5) {
printf("%d", x);
}else {
printf("%d", x--);
}
}
則輸出是______,
A、7 B、6 C、5 D、4
答案:B
第五題:
做對這題才算真真掌握噢~
設有陳述句int a = 3;則執行陳述句a += a -= a * a后,變數a的值是( ),
(A) 3 (B) 0 ? 9 (D) -12
答案:D
上面的陳述句可以轉換成:
int a = 3;
a -= (a * a);//*優先級高,先計算a*a為9,此時a -= 9;即 a = a - 9; a = -6
a += a // a = a + a; a = -6 + (-6),a = -12
2.5 C陳述句

2.5.1 if陳述句
if(運算式) { 執行內容 }
如果運算式為真,則執行{}里的內容,否則將跳過不執行該code
2.5.2 if…else 陳述句
if(運算式) {
代碼塊1;
}else {
代碼塊2;
}
如果運算式的值為真,則執行代碼塊1,否則執行代碼塊2
注意
if和else后面都沒有分號噢~
2.5.3 switch陳述句
switch (運算式)
{
case 情況1:
執行體1;
break;
case 情況2:
執行體2;
break;
default:
執行體3;
}
簡單解釋一下就是判斷運算式的幾種情況執行不一樣的代碼
注意:
case后的情況不能相同- 每個
case都需要有一個break陳述句 switch運算式只能是整型或者字符型別
重點:switch陳述句最大的好處是它能夠簡化if陳述句
2.5.4 while回圈
while(運算式) {
回圈體代碼
}
當運算式為真時會執行回圈體代碼,執行體代碼結束后,會再次判斷運算式是否為真,回圈往復,直至運算式為假
注意:回圈體代碼內應該改變回圈變數的值,否則會出現死回圈
2.5.5 do … while 回圈
do{
回圈體代碼
}while(回圈條件);
它先執行一次回圈體代碼,然后判斷while中的回圈條件是否為真,如果為真則繼續回圈;如果為假,則終止回圈,所以很重要的一點就是,do-while回圈至少會執行一次回圈體代碼,
注意:while括號后必須有分號
2.5.6 for回圈
for(運算式1;運算式2;運算式3) {
執行體代碼;
}
for回圈是最最最最重要的一個內容了,在考試中常常會要用到!
- 執行運算式1,對變數進行初始化
- 判斷運算式2,若為真,則執行
for回圈體中執行體代碼,代碼執行完畢 - 執行運算式3,對回圈變數進行操作
- 再進行第二步,直至判斷運算式為假
- 回圈結束,程式繼續向下執行,
#include <stdio.h>
int main ()
{
for( int a = 10; a < 20; a = a + 1 )
{
printf("a 的值: %d\n", a);
}
return 0;
}
/*輸出:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
*/
2.5.7 break陳述句
- 當 break 陳述句出現在一個回圈內時,回圈會立即終止,且程式流將繼續執行緊接著回圈的下一條陳述句,
- 它可用于終止 switch 陳述句中的一個 case
#include <stdio.h>
int main()
{
int a = 5;
while (a < 10)
{
printf("a的值%d\n", a);
a++;
if (a == 7)
{
break;
}
}
return 0;
}
/*
a的值5
a的值6 */
正如上面的代碼中當a == 7時執行了break陳述句跳出了while回圈,因此使得輸出陳述句只有兩條
2.5.8 continue陳述句
continue會跳過當前回圈中的代碼,強迫開始下一次回圈,
#include <stdio.h>
int main()
{
int a = 5;
while (a < 10)
{
a++;
if (a == 7)
{
continue;
}
printf("a的值%d\n", a);
}
return 0;
}
/* a的值6
a的值8
a的值9
a的值10 */
從上面的代碼可以看出,在a==7時遇到了continue則后面的代碼就不會再執行了,而是重新開始下一輪回圈
區別:break會終止整個回圈,而continue只是提前結束本輪回圈,
2.5.9 goto陳述句
goto陳述句可以將代碼執行跳轉到標記的位置,雖然這看起來很方便,但會使得程式得控制難以跟蹤,所以不推薦使用goto陳述句,僅作了解
goto here;
...
here:
2.5.10 練習題
答案在習題結束噢~
第一題:
若i為整型變數,則以下回圈的次數是
for (i = 2; i == 0;) {printf("%d", i–); }
A) 無限次 B) 0次 C) 1次 D) 2次
第二題:
下面這段程式運行后
i的值是( )A)11 B)13 C)12 D)14
#include <stdio.h>
int main()
{
int i = 10;
switch (i + 1)
{
case 10:
i++;
break;
case 11:
++i;
case 12:
++i;
break;
default:
i = i + 1;
}
}
第三題:
C陳述句for(;😉{…}是指( ),
(A)無意義 (B)無限回圈 ?回圈執行1次 (D)回圈執行0次
第四題:
#include <stdio.h>
int main()
{
int y = 10;
while(y--);
printf("y=%d",y);
}
以上程式執行后的輸出結果是
A、y=0 B、y=-1 C、y=1 D、while構成無限回圈
答案:B C B B
要點:第一題要注意for回圈的程序,要先判斷是否滿足條件才會執行回圈體,第二題要理解++i和i++的區別,同時也要注意case后面沒有break的后果,
2.6 資料的輸入輸出
2.6.1 printf函式輸出
格式為:printf(格式控制,輸出串列),輸出控制是用一對雙引號括起來的,包含格式宣告和普通字符,輸出串列是程式需要在輸出時原樣輸出的字符,

2.6.2 scanf函式輸入
從鍵盤獲得用戶輸入,格式為:scanf(格式控制,地址表列)
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a); // 輸入:23
printf("%d",a); // 輸出:23
}
和printf非常相似,但注意點有很多
注意:
scanf的變數前要帶一個&符號,&叫做取地址符,也就是獲取變數在記憶體中的地址,- 如果除了格式宣告還寫了其他東西,則在輸入資料時在對應位置上輸入與這些相同的字符,如:
scanf("a=%d,b=%d",&a,&b);
//輸入格式:a=1,b=2
2.6.3 putchar函式輸出
這個函式一次只會輸出一個單一的字符,但是可以在回圈內使用這個方法,以便輸出多個字符,
#include <stdio.h>
int main()
{
char a = 'B';
putchar(a);
}
注意:一次只能輸出一個字符,putchar()括號中可以填寫字符以及在ASCII內的整型
2.6.4 getchar函式輸入
這個函式一次只會讀取一個單一的字符
#include <stdio.h>
int main()
{
char a,b;
a = getchar();
b = getchar();
putchar(a);
putchar(b);
}
輸入jc 輸出jc
注意:在鍵入資訊時,字符會暫存在快取區中,只有在按下回車時,才會將輸入的字符送往計算機,按順序賦值
2.6.5 puts函式輸出
用來輸出字串并換行
#include <stdio.h>
int main(){
char str[]="i am ljc";
puts(str); // i am ljc
return 0;
}
注意:
- 只能輸出字串,不能輸出數值或格式轉換,
- 會自動輸出一個回車符
- 將字串結束符
\0轉換成\n
2.6.6 gets函式輸入
gets() 也存在緩沖區概念,當按下回車鍵時,就代表輸入結束了,gets() 開始從緩沖區中讀取內容,gets() 和 scanf() 的主要區別是:
scanf()讀取字串時以空格為分隔,遇到空格就認為當前字串結束了,所以無法讀取含有空格的字串,gets()中空格也是字串中的一部分,只有遇到回車鍵時才會認定字串輸入結束,所以,不管輸入了多少空格,只要沒有回車,對gets()來說就是一個完整的字串,
2.7 練習題
第一題:
有以下程式
#include <stdio.h>
int main()
{
char c1 = '1', c2 = '2';
c1 = getchar();
c2 = getchar();
putchar(c1);
putchar(c2);
}
當運行時輸入:a <回車> 后,以下敘述正確的是______,
A、變數C1 被賦予字符a,c2被賦予回車符
B、程式將等待用戶輸入第2個字符
C、變數c1被賦予字符a,,c2中仍是原有字符2
D、變數c1 被賦予字符a,c2中將無確定值
答案:A
第二題:
執行下列程式時輸入:123<空格>456<空格>789<回車>,輸出結果是______,
#include <stdio.h>
int main()
{
char s[100];
int c, i;
scanf("%c", &c);
scanf("%d", &i);
scanf("%s", s);
printf("%c,%d,%s \n", c, i, s);
}
A、123,456,789 B、1,456,789
C、1,23,456,789 D、1,23,456
答案:D
2.7 格式字符
2.7.1. d格式符
用來輸出一個有符號的十進制整數
注意:可以在格式宣告中指定輸出資料的域寬,"%5d",指定輸出資料占5列,輸出的資料顯示在此5列區域右側
printf("%5d\n%5d\n",12, -345);
輸出結果:
12(前3個空格)
-345(前1格空格)
2.7.2. c格式符
用來輸出一個字符
char ch = 'a';
printf("%c",ch);// 輸出a
同樣的可以指定域寬printf("%5c",ch)輸出a前有4個空格
注意:在0-127的整數也可以用%c輸出,在輸出之前會轉換成對應的ASCII碼,如果整數比較大則輸出第一個位元組的資訊對應的字符
short a = 121;
printf("%c", a); // y
當數比較大時
int a = 377;
printf("%c", a); // y
因為以%c格式輸出,所以只考慮第一個位元組,a在記憶體中的存放方式是這樣的,第一個位元組所對應的十進制為121,對應y

2.7.3. s格式符
用來輸出一個字串
printf("%s","china");// 輸出: china
2.7.4. f格式符
用來輸出實數,以小數形式輸出
- 基本型,
%f
不指定輸出資料長度,由系統來決定資料所占的列數,一般是小數輸出6位
double a = 1.0;
printf("%f",a/3);// 輸出: 0.333333
輸出了6個3
- 指定資料的寬度和小數位數,用
%m.nf
這里的意思是指定域寬為m,小數點后保留n位數字
double a = 1.0;
printf("%7.2f",a/3);// 輸出: 0.33(前面有3個空格噢)
注意:
-
如果n為0,則不僅不輸出小數,也不輸出小數點
-
如果n的值過大,也不能保證全部輸出,原因之一是double型別資料只能保證15位有效數字
- 輸出的資料向左對齊,用
%-m.nf
當資料長度不超過m時,資料向左靠齊,右邊補空格
2.7.5. e格式符
以指數形式輸出
printf("%e",123.456);// 輸出:1.234560e+002
如果不指定輸出的寬度和數字部分的小數位數,將以小數部分6位,指數部分5位來定

2.7.6. 格式字符匯總
| 格式字符 | 說明 |
|---|---|
| d,i | 以帶符號的十進制形式輸出整數(正數無符號) |
| o | 以八進制無符號形式輸出整數(不輸出前導符0) |
| x,X | 以十六進制無符號形式輸出整數(不輸出0x) |
| u | 以無符號十進制形式輸出整數 |
| c | 字符形式輸出,只輸出一個字符 |
| s | 輸出字串 |
| f | 以小數形式輸出單,雙精度,默認6位小數 |
| e,E | 以指數形式輸出實數,用e則出e,用E則顯示E |
| g,G | 選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0,用G時,若以指數形式輸出,則指數以大寫顯示 |
2.7.7 練習題
第一題:
以下程式的輸出結果是()
int a = 1234;
printf("%2d",a)
A) 12 B) 34 C)1234 D) 提示錯誤,無結果
答案:C
第二題:
已知字母A的ASCII碼為十進制的65,下面程式的輸出是______,
#include <stdio.h>
int main()
{
char ch1, ch2;
ch1 = 'A' + '5' - '3';
ch2 = 'A' + '6' - '3';
printf("%d,%c\n", ch1, ch2);
}
A、67,D B、B,C C、C,D D、不確定的值
答案:A
2.8 程式設計題目
第一題:
撰寫列印如下圖形的程式(要求實作讀取用戶輸入,列印幾行圖形,用回圈實作),示例:輸入4
輸入5
#include <stdio.h>
int main()
{
int n, i, j;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("*");
}
printf("\n");
}
}
第二題:
經典題目:輸入一個年份判斷是閏年還是平年
#include <stdio.h>
int main()
{
int i;
printf("請輸入一個年份:");
scanf("%d", &i);
if (i % 100 == 0)
{
if (i % 400 == 0)
{
printf("%d是閏年\n", i);
}
else
{
printf("%d是平年\n", i);
}
}
else if (i % 4 == 0)
{
printf("%d是閏年\n", i);
}
else
{
printf("%d年是平年", i);
}
return 0;
}
第三題:
撰寫程式:計算20到30的每個整數立方根之和(保留小數點后兩位)
#include <stdio.h>
#include <math.h>
int main()
{
int i;
double s = 0;
for (i = 20; i <= 30; i++)
{
s = s + pow(i, 1.0 / 3); //如果平方根改為s=s+sqrt(i);
}
printf("%.2f\n", s);
return 0;
}
3. 陣列
陣列是一組具有相同型別的資料的集合,這些資料稱為陣列元素,
3.1 一維陣列
格式為:型別符 陣列名[常量運算式],陣列的所占位元組數為元素個數與基型別所占位元組數的乘積,
3.1.1 一維陣列的初始化
三種方式
int array[5] = {1,2,3,4,5}int array[] = {1,2}int array[2]; a[0] = 1;a[1]=2;
注意:
- 下標從0開始
- 陣列內元素的個數不能大于宣告的陣列長度
- 當元素個數小于陣列的長度時,多余的陣列元素初始化為0
3.1.2 參考一維陣列元素
陣列元素可以通過陣列名稱加索引進行訪問,格式為:陣列名[下標]
int a = b[1];
3.1.3 遍歷一維陣列
通過回圈的方式可以寫入和訪問陣列元素,而不用人為的每次獲取指定某個位置上的元素
#include <stdio.h>
int main()
{
int i, a[10];
for (i = 0; i <= 9; i++)
{
a[i] = i;
}
for (i = 9; i >= 0; i--)
{
printf("%d ", a[i]);
}
return 0;
}
上面的程式實作了給陣列a賦值0-9,再按照下標大到小輸出這10個元素
注意:
- 避免陣列越界訪問,回圈變數
i不要超過陣列的長度 - C語言中不存在
length方法😢,需要通過sizeof來計算陣列長度
int length = sizeof(arr) / sizeof(arr[0])
3.1.4 利用陣列輸出斐波那契數列
輸出斐波那契數列的前20項,每5個換行
#include <stdio.h>
int main()
{
int i;
int f[20] = {1, 1}; //斐波那契數列前兩位賦初值
for (i = 2; i < 20; i++)
{
f[i] = f[i - 2] + f[i - 1];
}
for (i = 0; i < 20; i++)
{
if (i % 5 == 0)
{
printf("\n");
}
printf("%d ", f[i]);
}
return 0;
}
輸出:

3.2 二維陣列
多維陣列中最簡單的就是二維陣列,二維陣列有兩個下標,用來確定它在陣列中的位置,二維陣列可以被認定為是一個由行列組成的方陣,但是在記憶體中是線性的,按行依次來進行存放
格式為:型別說明符 陣列名[常量運算式] [常量運算式]
3.2.1 二維陣列的初始化
第一種
int num[2][3] = {{1,2,3},{4,5,6}};

第二種
int num[2][3];
num[1][1] = 2;
第三種
int a[2][3] = {1,2,3,4,5,6}
注意:
- 由于系統會根據陣列中元素的總個數來分配空間,所以當知道元素總個數以及列的維數后,會計算出行的維數
- 二維陣列定義時可以不指定行,但是一定要指定列
3.2.2 參考二維陣列元素
格式為:陣列名[下標] [下標]
如:a[1][2]
注意:
- 陣列元素可以出現在運算式中,可以被賦值
b[1][2] = a[2][3]/2 - 在參考陣列元素時,下標應在已經定義的陣列大小的范圍內
int a[3][4],但是不存在a[3][4]元素噢~
3.2.3 遍歷二維陣列
遍歷二維陣列采用的方式是雙重for回圈,變數i用來遍歷行,j用來遍歷列
#include <stdio.h>
int main()
{
int num[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d", num[i][j]);
}
}
}
3.2.3 練習題
第一題
#include <stdio.h>
int main()
{
int i;
int x[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for(i = 0;i<3;i++) {
printf("%d ",x[i][2-i]);
}
}
上面程式的輸出結果是
A、1 5 9 B、1 47 C、3 5 7 D、3 6 9
答案:C
第二題
以下能正確定義陣列并正確賦初值的陳述句是______,
A、
int N=5,b[N][N];B、
int a[1][2]={{1},{3}};C、
int c[2][]={{1,2},{3,4}};D、
int d[3][2]={{1,2},{3,4}};
答案:D
3.3 字符陣列
在C語言中沒有字串型別,也沒有字串變數,字串是存放在字符型陣列中的,
我們把用來存放字符資料的陣列稱為字符陣列,陣列中的每一個元素記憶體放著一個字符
3.3.1 字符陣列初始化
char 字串名稱[長度] = "字串"char 字串名稱[長度]= {'字符','字符'}
注意:
[]中的長度可以省略不寫- 采用第二種方式定義陣列,最后一個元素必須為
\0 - 如果初值個數小于陣列長度,則后面自動補為
\0,\0為字串結束的標志
3.3.2 遍歷輸出字符陣列中的元素
#include <stdio.h>
int main()
{
char c[] = "I am ljc";
for (int i = 0; i < sizeof(c) / sizeof(c[0]); i++)
{
printf("%c", c[i]);
}
return 0;
}
先定義一個字符陣列,然后通過for回圈來訪問輸出字符陣列中的字符
3.3.3 字串的結束符
-
在存盤字串時,系統會自動在其尾部加上一個空值
\0,同時要占用一個位元組,因此字串ljc需要占四個位元組, -
因此字符陣列的大小要比它將要實際存放的字串多一個元素,用來存放
\0
char c[] = "i am\0 ljc";
printf("%s\n",c);
由于\0為字串的結束標志,在輸出字串陣列時遇到\0就會停止輸出,因此只會輸出i am
3.3.4 字串的輸入輸出
- 逐個字符輸入輸出,采用格式符
%c輸入或輸出一個字符 - 將整個字串輸入輸出,采用
%s格式符,如printf("%s\n",c);
注意:
- 輸出的字符中不包括
\0 - 通過
%s輸出時,輸出表列填寫的是陣列名稱,而不是陣列元素 - 遇到第一個
\0就結束 - 在采用scanf輸入字串時,直接使用陣列名稱,不需要采用取地址符,因為陣列名代表了陣列的起始地址
特別注意
char str[13];
scanf("%s",str);
對于上面的代碼,當輸入i am ljc時,只會把i存入陣列當中,這是因為系統把空格當作了字串之間的分隔符
3.3.5 練習題
若有定義和陳述句:
則結果是(以下u代表空格) ______,
A、輸出abcd B、輸出a
C、輸出abcduuuuu D、編譯不通過
char s[10];
s = "abcd";
printf("%s\n",s);
答案:D
3.4 字串處理函式
在使用之前需要引入頭檔案string.h
| 序號 | 作用 |
|---|---|
strcpy(s1, s2); | 復制字串 s2 到字串 s1, |
strcat(s1, s2); | 連接字串 s2 到字串 s1 的末尾, |
strlen(s1); | 回傳字串 s1 的長度, |
strcmp(s1, s2); | 如果 s1 和 s2 是相同的,則回傳 0;如果 s1<s2 則回傳小于 0;如果 s1>s2 則回傳大于 0, |
strchr(s1, ch); | 回傳一個指標,指向字串 s1 中字符 ch 的第一次出現的位置, |
strstr(s1, s2); | 回傳一個指標,指向字串 s1 中字串 s2 的第一次出現的位置, |
3.4.1. strcat函式
字串連接函式,它的作用是把兩個字符陣列中的字串連接起來
使用方法
strcat(字符陣列1,字符陣列2)
下面程式輸出i am ljc i am 18
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "i am ljc ";
char str2[] = "i am 18";
printf("%s",strcat(str1,str2));
}
3.4.2. strcpy函式
字串復制函式,作用是將字串2復制到字符陣列1中
使用方法
strcpy(字符陣列1,字符陣列2)
輸出:china
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "ljc";
char str2[] = "china";
printf("%s",strcpy(str1,str2));
}
該方法會覆寫原來的字串,并且不能拷貝字串常量
注意:可以使用strncpy函式來指定復制字串的字符數,例如strncpy(str1,str2,2),作用是將str2中的前2個字符復制到str1中原有的前兩個字符,
輸出:chinajc
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "nameljc";
char str2[] = "china";
printf("%s",strncpy(str1,str2,5));
}
3.4.3. strcmp函式
字串比較函式,作用是比較字串1和字串2
比較的規則:將兩個字串自左向右逐個字符按照ASCII碼值大小比較,直到出現不同的字符或者遇到\0結束
- 如果全部字符相同則認為兩個字串相等
- 若出現不相同的字符,則以第一對不相同的字符的比較結果為準
比較結果由函式值帶回
- 如果字串1和字串2相同,則函式值為0
- 如果字串1大于字串2,則函式值為1個正整數
- 如果字串1小于字串2,則函式值為1個負整數
使用方法
下面的程式輸出1,表示字串1小于字串2
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "nameljc";
char str2[] = "china";
printf("%d",strcmp(str1,str2));// 1
}
3.4.4. strlen函式
測字串長度的函式,作用是檢測字串長度
使用方法
strlen(str)
輸出:5,可見輸出的是字串的實際長度,不包括\0
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "china";
printf("%d",strlen(str));
}
3.4.5. strlwr函式
將大寫轉換為小寫的函式
使用方法
strlwr(字串)
輸出:ljc
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "LJC";
printf("%s",strlwr(str));
}
3.4.6. strupr函式
將小寫轉換為大寫的函式
使用方法
strupr(字串)
輸出:I AM LJC
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "i am ljc";
printf("%s",strupr(str));
}
3.4.7 練習題
函式呼叫:strcat(strcpy(str1,str2),str3)的功能是______,
A、將串str1復制到串str2中后再連接到串str3之后
B、將串str1連接到串str2之后再復制到串str3之后
C、將串str2復制到串str1中后再將串str3連接到串str1之后
D、將串str2連接到串str1之后再將串str1復制到串str3中
答案:C
博主累了,碼了幾天,已經碼了上萬字了,自己也是一邊復習一邊整理,感徑訓不錯噢,相信你也一定能夠學到很多噢!掛科不存在的!下集預計在下周一發出,大家先收藏好吧~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286805.html
標籤:其他


