æä¾åºæ¬è¯æ³åæ¹æ³ç C å¿«éåèå¤å¿åã
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
ä½¿ç¨ gcc ç¼è¯ hello.c æºæä»¶
$ gcc -o hello hello.c
è¿è¡ç¼è¯åçäºè¿å¶æä»¶å¯æ§è¡æä»¶(hello)
$ ./hello
# è¾åº => Hello World
int myNum = 15; // å®ä¹å¹¶åå§ååé myNum
int myNum2; // 声æåé myNum2
myNum2 = 15; // åå§ååé myNum2
int myNum3 = 15; // å®ä¹å¹¶åå§ååé myNum3
myNum3 = 10; // éæ°èµå¼ myNum3
å®ä¹ä¸åç±»åçåé
// å®ä¹å¹¶åå§åæµ®ç¹æ°åé
float myFloatNum = 5.99;
// å®ä¹å¹¶åå§åå符åé
char myLetter = 'D';
åéç¸å
int x = 5, y = 6;
int sum = x + y; // åéç¸å
声æå¹¶åå§åå¤ä¸ªåé
int x = 5, y = 6, z = 50;
int a, b, c = 10;
ä» å£°æåéä¸åå§å
int result;
// æªåå§åçåé result ä¼å¯¼è´ä¸å¯é¢æµçç»æ
result = result + 10; // éè¯¯ï¼æªåå§åçåé
// é¨åç¼è¯å¨ä¼è¦åæªåå§åçåéå¯è½å¯¼è´æªå®ä¹è¡ä¸º
叏鿝ä¸è½è¢«æ¹åçå¼ï¼ä½¿ç¨å¸¸éå¯ä»¥ä½¿ä»£ç æ´æ¸ æ°åå®å ¨ã
const int minutesPerHour = 60;
const float PI = 3.14;
æä½³å®è·µ
const int BIRTHYEAR = 1980;
常éé常使ç¨å ¨å¤§å忝ï¼åè¯é´ç¨ä¸å线åéï¼å¦ BIRTHYEARãMAX_LENGTHï¼ã
ä½¿ç¨ const å®ä¹æ°ç»å¤§å°ï¼ç¼è¯å¨å°å
¶ä½ä¸ºç¼è¯æ¶å¸¸éå¤çã
#define ä¸ const#defineï¼å®å¸¸éå¨é¢å¤çé¶æ®µæ¿æ¢ï¼ä¸è¿è¡ç±»åæ£æ¥constï¼ç±»åå®å
¨ç常éï¼ç¼è¯å¨å¯æ£æ¥ç±»åï¼æ¨è使ç¨const 常éå¨å®ä¹æ¶å¿
é¡»åå§åï¼å¦åä¼å¯¼è´ç¼è¯é误ãconst 常éçå¼ä¸è½è¢«ä¿®æ¹ï¼ä»»ä½å°è¯ä¿®æ¹ const 常éçæä½é½ä¼å¯¼è´ç¼è¯é误ãconst 常éå¯ä»¥æé«ä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ï¼é¿å
éæ³æ°åç使ç¨ã// è¿æ¯ä¸ä¸ªåè¡æ³¨é
printf("Hello World!"); // è¡å
注é
/*
å¤è¡æ³¨éï¼
ç¨äºæ³¨éè·¨å¤è¡çå
容
注æï¼å¤è¡æ³¨éä¸è½åµå¥ï¼å¦åä¼å¯¼è´ç¼è¯é误
*/
注æ:
// å¯ä»¥åµå¥ï¼å¦ /////ã/* è¿æ¯ä¸ä¸ªå¤è¡æ³¨éçå¼å§
/* åµå¥çå¤è¡æ³¨éï¼Cè¯è¨ä¸æ¯æ */
*/
printf("I am learning C.");
int testInteger = 5;
printf("Number = %d", testInteger);
float f = 5.99; // æµ®ç¹æ°
printf("Value = %f", f);
short a = 0b1010110; // 2 è¿å¶æ°å
int b = 02713; // 8 è¿å¶æ°å
long c = 0X1DAB83; // 16 è¿å¶æ°å
åéaåcåå«ä¸º short å long åï¼æä»¥è¾åºå¿
é¡»å ä¸å¯¹åºç修饰符 h å l
printf("a=%ho, b=%o, c=%lo\n", a, b, c);
// è¾åº => a=126, b=2713, c=7325603
printf("a=%hd, b=%d, c=%ld\n", a, b, c);
// è¾åº => a=86, b=1483, c=1944451
printf("a=%hx, b=%x, c=%lx\n", a, b, c);
// è¾åº => a=56, b=5cb, c=1dab83
printf("a=%hX, b=%X, c=%lX\n", a, b, c);
// è¾åº => a=56, b=5CB, c=1DAB83
int a1=20, a2=345, a3=700;
int b1=56720, b2=9999, b3=20098;
int c1=233, c2=205, c3=1;
int d1=34, d2=0, d3=23;
// %-9d: åè¿å¶è¾åºï¼æå°å®½åº¦ä¸º9ï¼å·¦å¯¹é½
printf("%-9d %-9d %-9d\n", a1, a2, a3);
printf("%-9d %-9d %-9d\n", b1, b2, b3);
printf("%-9d %-9d %-9d\n", c1, c2, c3);
printf("%-9d %-9d %-9d\n", d1, d2, d3);
è¾åºç»æ
20 345 700
56720 9999 20098
233 205 1
34 0 23
è§£éï¼%-9dï¼d 表示åè¿å¶è¾åºï¼9 表示æå°å 9 个å符宽度ï¼- 表示左对é½ï¼ä¸ä½¿ç¨ - åé»è®¤å³å¯¹é½ã
å¯¹äºæ´åæ°æ®ï¼
int a = 12345;
printf("%md", a);
m <= å®é
æ°æ®å®½åº¦ï¼åæå®é
æ
åµè¾åºãm > å®é
æ°æ®å®½åº¦ï¼åå¨å·¦è¾¹ç¨ç©ºæ ¼è¡¥é½ãprintf("%0md", a); åå¨å·¦è¾¹ç¨ 0 è¡¥é½ãå¯¹äºæµ®ç¹åæ°æ®ï¼
float a = 1.2345;
printf("%m.nf", a);
// m -- æ´ä¸ªæ°æ®å®½åº¦ï¼n -- å°æ°ä½æ°
> nï¼æªå»å¤ä½å°æ°ï¼æ³¨æåèäºå
¥ã< nï¼å¨å°æ°æåè¡¥ 0ãm çç¥ååä½ %.nï¼æ´æ°é¨åæå®é
è¾åºï¼å°æ°é¨åæä»¥ä¸è§åãm < n+1ï¼èªå¨çªç ´å®½åº¦éå¶ï¼æå®é
æ°æ®è¾åºãm > n+1ï¼å·¦è¾¹è¡¥ç©ºæ ¼ãå¨ C è¯è¨ä¸ï¼å符串æ¯ä»¥ \0 ç»å°¾çå符æ°ç»ï¼è䏿¯ä¸ç§åç¬çæ°æ®ç±»åãå¯ä»¥éè¿å符æ°ç»æ¥è¡¨ç¤ºå符串ã
char greetings[] = "Hello World!";
printf("%s", greetings);
char greetings[] = "Hello World!";
printf("%c", greetings[0]);
访é®å符串 greetings ç第ä¸ä¸ªå符 H
char greetings[] = "Hello World!";
greetings[0] = 'J'; // ä¿®æ¹ç¬¬ä¸ä¸ªå符为 'J'
printf("%s", greetings);
// è¾åº "Jello World!"
char greetings[] = {'H','e','l','l','\0'};
printf("%s", greetings);
// è¾åº "Hell"
注æï¼C è¯è¨ä¸æ²¡æ String ç±»åï¼å符串æ¯ç±å符æ°ç» char[] 表示çï¼ä¸å¿
须以 \0 ç»å°¾ä»¥æ è¯å符串çç»æã
int time = 20;
if (time < 18) {
printf("åä¼ï¼");
} else {
printf("æä¸å¥½ï¼");
}
// è¾åº -> "æä¸å¥½ï¼"
int time = 22;
if (time < 10) {
printf("æ©ä¸å¥½ï¼");
} else if (time < 20) {
printf("åä¼ï¼");
} else {
printf("æä¸å¥½ï¼");
}
// è¾åº -> "æä¸å¥½ï¼"
int time = 10;
if (time > 8) {
//ååµå¥ä¸ä¸ªif
if (time < 12) {
printf("ä¸å好ï¼")
}
}
// è¾åº -> "ä¸å好ï¼"
if è¯å¥ç¨äºæ ¹æ®æ¡ä»¶æ§è¡ä»£ç åãelse è¯å¥å¨ if æ¡ä»¶ä¸æ»¡è¶³æ¶æ§è¡ãelse if è¯å¥ç¨äºæ£æ¥å¤ä¸ªæ¡ä»¶ãif è¯å¥ä»¥æ£æ¥å¤ä¸ªæ¡ä»¶ãä¸å
è¿ç®ç¬¦ï¼? :ï¼æ¯ä¸ç§ç®æ´çæ¡ä»¶å¤ææ¹å¼ï¼ç¨äºæ ¹æ®æ¡ä»¶éæ©è¡¨è¾¾å¼çå¼ãç±ä¸ä¸ªé¨åç»æï¼
åºæ¬è¯æ³ï¼(æ¡ä»¶) ? 表达å¼1 : 表达å¼2;
妿 æ¡ä»¶ 为çï¼åè¿å 表达å¼1ï¼å¦åè¿å 表达å¼2ã
int time = 20;
(time < 18) ? printf("åä¼ï¼")
: printf("æä¸å¥½ï¼");
// è¾åº -> "æä¸å¥½ï¼"
åµå¥ä½¿ç¨ç¤ºä¾ï¼ä¸å»ºè®®è¿å¤åµå¥ï¼ï¼
int time = 22;
printf((time < 10) ? "æ©ä¸å¥½ï¼"
: (time < 20) ? "åä¼ï¼"
: "æä¸å¥½ï¼");
// è¾åº -> "æä¸å¥½ï¼"
int day = 4;
switch (day) {
case 3: printf("å¨ä¸"); break;
case 4: printf("å¨å"); break;
default: printf("æå¾
卿«");
}
// è¾åº -> "å¨å"
switch è¯å¥æ ¹æ®è¡¨è¾¾å¼çå¼è·³è½¬å°å¹é
ç case æ ç¾ãcase åæ§è¡ç¸åºä»£ç ï¼å¹¶éè¿ break è·³åº switchãcaseï¼åæ§è¡ default è¯å¥ï¼å¦æåå¨ï¼ãswitch 表达å¼å¯ä»¥æ¯æ´åãå符ååæä¸¾åãcase åç常é表达å¼å¼ä¸è½ç¸åãcase åå¯ä»¥æå¤ä¸ªè¯å¥ï¼ä¸éè¦ { } æ¬èµ·æ¥ãcase å default è¯å¥ç顺åºä¸å½±åç¨åºæ§è¡ç»æãbreak è¯å¥ç¨äºç»æ switchï¼å¦ææ²¡æ breakï¼ç¨åºä¼ç»§ç»æ§è¡ä¸ä¸ä¸ª caseãint day = 3;
switch (day) {
case 3: printf("å¨ä¸");
case 4: printf("å¨å"); break;
default: printf("æå¾
卿«");
}
// è¾åº -> "å¨ä¸å¨å"
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
// è¾åº -> 0 1 2 3 4
while 循ç¯é¦å
æ£æ¥æ¡ä»¶ i < 5 æ¯å¦ä¸ºçãi çå¼ãi è¾¾å° 5ï¼æ¤æ¶æ¡ä»¶ i < 5 ä¸å为çï¼å¾ªç¯ç»æãint i = 1;
while (i <= 10) {
printf("%d\n", i);
i++;
}
// è¾åº -> 1 2 3 4 5 6 7 8 9 10
int i = 0;
while (i <= 10) {
if (i % 2 == 0) {
printf("%d\n", i);
}
i++;
}
// è¾åº -> 0 2 4 6 8 10
int i = 0;
while (1) {
printf("æ é循ç¯\n");
i++;
if (i == 5) break; // æ·»å æ¡ä»¶ä»¥éåºå¾ªç¯
}
// è¾åº -> æ éå¾ªç¯ (æå° 5 次)
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
// è¾åº -> 0 1 2 3 4
do/while 循ç¯è³å°æ§è¡ä¸æ¬¡å¾ªç¯ä½ï¼å 为æ¡ä»¶æ£æ¥å¨å¾ªç¯ä½æ§è¡ä¹åè¿è¡ãdo ä¸ç代ç ï¼ç¶åæ£æ¥æ¡ä»¶ i < 5 æ¯å¦ä¸ºçãint i = 5;
do {
printf("%d\n", i); // è¾åº 5
i++;
} while (i < 5);
// è¾åº -> 5
int i = 1;
int sum = 0;
do {
sum += i;
i++;
} while (i <= 10);
printf("Sum: %d\n", sum);
// è¾åº -> Sum: 55
for (表达å¼1; 表达å¼2; 表达å¼3) {
循ç¯ä½è¯å¥;
}
示ä¾ï¼
int i;
for (i = 0; i < 5; i++) {
printf("%d\n", i);
}
// è¾åº -> 0 1 2 3 4
for è¯å¥çä¸ä¸ªè¡¨è¾¾å¼ä¸æ¯å¿
é¡»çãfor 循ç¯ç»æãbreakãcontinueãgoto è¯å¥ãfor(;;) ç¸å½äº while(1)ãfor (i = m; i < n; i++) ä» i = m å¼å§å° i = n-1ï¼å¾ªç¯ n - m 次ãfor (i = m; i <= n; i++) ä» i = m å° i = nï¼å¾ªç¯ n - m + 1 次ãbreak è¯å¥è·³åºå½åå¾ªç¯æ switch è¯å¥ï¼æ§è¡åç»ä»£ç ã
int i;
for (i = 0; i < 10; i++) {
if (i == 4) {
break;
}
printf("%d\n", i);
}
// è¾åº -> 0 1 2 3
continue è¯å¥è·³è¿å½å循ç¯çå©ä½è¯å¥ï¼ç´æ¥è¿å ¥ä¸ä¸æ¬¡å¾ªç¯ã
int i;
for (i = 0; i < 10; i++) {
if (i == 4) {
continue;
}
printf("%d\n", i);
}
// è¾åº -> 0 1 2 3 5 6 7 8 9
goto è¯å¥æ æ¡ä»¶è·³è½¬å°æå®æ ç¾ä½ç½®ã
int i = 0;
while (i < 10) {
if (i == 4) {
goto skip; // è·³è½¬å° skip æ ç¾
}
printf("%d\n", i);
i++;
}
skip:
printf("Exited the loop at i = %d\n", i);
// è¾åº -> 0 1 2 3 Exited the loop at i = 4
goto è¯å¥åºæ
ç¨ï¼é¿å
代ç é»è¾æ··ä¹±ï¼é常使ç¨å¾ªç¯ææ¡ä»¶è¯å¥ä»£æ¿ã// 声æä¸ä¸ªç±åä¸ªæ´æ°ç»æçæ°ç»
int myNumbers[4];
// æ·»å å
ç´
myNumbers[0] = 25;
myNumbers[1] = 50;
myNumbers[2] = 75;
myNumbers[3] = 100;
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
å®ä¹æä¸¾åé
enum week a, b, c;
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
æäºæä¸¾åéï¼å°±å¯ä»¥æå表ä¸çå¼èµç»å®
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
// æè
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
enum week {Mon = 1, Tues, Wed, Thurs} day;
scanf("%d", &day);
switch(day){
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
default: puts("Error!");
}
int myNumbers[] = {25, 50, 75, 100};
printf("%d", myNumbers[0]); // è¾åº 25
int myNumbers[] = {25, 50, 75, 100};
myNumbers[0] = 33;
printf("%d", myNumbers[0]); // è¾åº 33
int myNumbers[] = {25, 50, 75, 100};
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", myNumbers[i]);
}
// è¾åº -> 25 50 75 100
// å建ä¸ä¸ªæ´æ°å鿥å卿们ä»ç¨æ·é£éå¾å°çæ°å
int myNum;
// è¦æ±ç¨æ·è¾å
¥ä¸ä¸ªæ°å
printf("请è¾å
¥ä¸ä¸ªæ°å: \n");
// è·åå¹¶ä¿åç¨æ·è¾å
¥çå·ç
scanf("%d", &myNum);
// è¾åºç¨æ·è¾å
¥çæ°å
printf("æ¨è¾å
¥çæ°å: %d", myNum);
// å建ä¸ä¸ªå符串
char firstName[30];
// è¦æ±ç¨æ·è¾å
¥ä¸äºææ¬
printf("è¾å
¥æ¨çåå: \n");
// è·åå¹¶ä¿åææ¬
scanf("%s", firstName);
// è¾åºææ¬
printf("Hello %s.", firstName);
å建åéæ¶ï¼ä¼ä¸ºè¯¥åéåé ä¸ä¸ªå åå°åã
int myAge = 43;
printf("%p", &myAge);
// è¾åº myAge çå
åå°åï¼ä¾å¦ï¼0x7ffe5367e044
è¦è®¿é®åéçå
åå°åï¼è¯·ä½¿ç¨å¼ç¨è¿ç®ç¬¦ (&)ã
int myAge = 43; // ä¸ä¸ª int åé
int *ptr = &myAge; // å建æå myAge çæé
printf("%d\n", myAge); // è¾åº myAge çå¼ -> 43
printf("%p\n", &myAge); // è¾åº myAge çå
åå°åï¼ä¾å¦ï¼0x7ffe5367e044
printf("%p\n", ptr); // è¾åºæé ptr çå¼ï¼å³ myAge çå
åå°åï¼
printf("%d\n", *ptr); // éè¿æéè®¿é® myAge çå¼ -> 43
int myAge = 43; // åé声æ
int* ptr = &myAge; // æé声æ
// åèï¼ç¨æéè¾åº myAge ç
// å
åå°åï¼0x7ffe5367e044ï¼
printf("%p\n", ptr);
// åæ¶å¼ç¨ï¼ç¨æéè¾åº myAge çå¼ (43)
printf("%d\n", *ptr);
int myAge = 43; // ä¸ä¸ª int åé
int* ptr = &myAge; // å为 ptr çæéåéï¼ç¨äºåå¨ myAge çå°å
printf("%d\n", myAge); // è¾åº myAge (43) çå¼
printf("%p\n", &myAge); // è¾åº myAge çå
åå°åï¼0x7ffe5367e044ï¼
printf("%p\n", ptr); // ç¨æéï¼0x7ffe5367e044ï¼è¾åºmyAgeçå
åå°å
int myNum = 100 + 50;
int sum1 = 100 + 50; // 150 (100 + 50)
int sum2 = sum1 + 250; // 400 (150 + 250)
int sum3 = sum2 + sum2; // 800 (400 + 400)
| Operator | Name | Description | Example |
|---|---|---|---|
+ | å | å°ä¸¤ä¸ªå¼ç¸å | x + y |
- | å | ä»å¦ä¸ä¸ªå¼ä¸åå»ä¸ä¸ªå¼ | x - y |
* | ä¹ | å°ä¸¤ä¸ªå¼ç¸ä¹ | x * y |
/ | é¤ | å°ä¸ä¸ªå¼é¤ä»¥å¦ä¸ä¸ª | x / y |
% | 忍¡ | è¿å餿³ä½æ° | x % y |
++ | å¢é | å°åéçå¼å¢å 1 | ++ |
-- | ä¹é | å°åéçå¼å 1 | --x |
| ç¬¦å· | ç¤ºä¾ | å¦å |
|---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 3 | x = x - 3 |
*= | x *= 3 | x = x * 3 |
/= | x /= 3 | x = x / 3 |
%= | x %= 3 | x = x % 3 |
&= | x &= 3 | x = x & 3 |
|= | x |= 3 | x = x | 3 |
^= | x ^= 3 | x = x ^ 3 |
>>= | x >>= 3 | x = x >> 3 |
<<= | x <<= 3 | x = x << 3 |
int x = 5;
int y = 3;
printf("%d", x > y);
// è¿å 1ï¼çï¼ï¼å 为 5 å¤§äº 3
| ç¬¦å· | åç§° | ç¤ºä¾ |
|---|---|---|
== | çäº | x == y |
!= | ä¸çäº | x != y |
> | å¤§äº | x > y |
< | å°äº | x < y |
>= | å¤§äºæçäº | x >= y |
<= | å°äºæçäº | x <= y |
æ¯è¾è¿ç®ç¬¦ç¨äºæ¯è¾ä¸¤ä¸ªå¼
| ç¬¦å· | åç§° | 说æ | ç¤ºä¾ |
|---|---|---|---|
&& | ä¸é»è¾ | å¦æä¸¤ä¸ªè¯å¥é½ä¸ºçï¼åè¿åç | x < 5 && x < 10 |
|| | æé»è¾ | å¦æå ¶ä¸ä¸ä¸ªè¯å¥ä¸ºçï¼åè¿åç | x < 5 || x < 4 |
! | éé»è¾ | åè½¬ç»æï¼å¦æç»æä¸ºçåè¿åå | !(x < 5 && x < 10) |
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c ç弿¯ %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c ç弿¯ %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - c ç弿¯ %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c ç弿¯ %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c ç弿¯ %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c ç弿¯ %d\n", c );
| è¿ç®ç¬¦ | æè¿° | å®ä¾ |
|---|---|---|
& | æä½ä¸æä½ï¼æäºè¿å¶ä½è¿è¡"ä¸"è¿ç® | (A & B) å°å¾å° 12 å³ä¸º 0000 1100 |
| | æä½æè¿ç®ç¬¦ï¼æäºè¿å¶ä½è¿è¡"æ"è¿ç® | (A | B) å°å¾å° 61 å³ä¸º 0011 1101 |
^ | 弿è¿ç®ç¬¦ï¼æäºè¿å¶ä½è¿è¡"弿"è¿ç® | (A ^ B) å°å¾å° 49 å³ä¸º 0011 0001 |
~ | ååè¿ç®ç¬¦ï¼æäºè¿å¶ä½è¿è¡"åå"è¿ç® | (~A) å°å¾å° -61 å³ä¸º 1100 0011 |
<< | äºè¿å¶å·¦ç§»è¿ç®ç¬¦ | A << 2 å°å¾å° 240 å³ä¸º 1111 0000 |
>> | äºè¿å¶å³ç§»è¿ç®ç¬¦ | A >> 2 å°å¾å° 15 å³ä¸º 0000 1111 |
| æ°æ®ç±»å | å¤§å° Size | èå´ Range | æè¿° Description |
|---|---|---|---|
char | 1 åè | â128 ~ 127 | å个å符/忝/æ°å/ASCII |
signed char | 1 åè | â128 ~ 127 | - |
unsigned char | 1 åè | 0 ~ 255 | - |
int | 2 å° 4 åè | â32,768 ~ 32,767 | å卿´æ° |
signed int | 2 åè | â32,768 ~ 32,767 | |
unsigned int | 2 åè | 0 ~ 65,535 | |
short int | 2 åè | â32,768 ~ 32,767 | |
signed short int | 2 åè | â32,768 ~ 32,767 | |
unsigned short int | 2 åè | 0 ~ 65,535 | |
long int | 4 åè | -2,147,483,648 ~ 2,147,483,647 | |
signed long int | 4 åè | -2,147,483,648 ~ 2,147,483,647 | |
unsigned long int | 4 åè | 0 ~ 4,294,967,295 | |
float | 4 åè | ||
double | 8 åè | ||
long double | 10 åè |
// å建åé
int myNum = 5; // æ´æ°
float myFloatNum = 5.99; // æµ®ç¹æ°
char myLetter = 'D'; // å符串
// é«ç²¾åº¦æµ®ç¹æ°æ®ææ°å
double myDouble = 3.2325467;
// æå°è¾åºåé
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
printf("%lf\n", myDouble);
| æ°æ®ç±»å | 说 æ |
|---|---|
char | å符å |
short | çæ´å |
int | æ´å |
long | é¿æ´å |
float | å精度浮ç¹å |
double | å精度浮ç¹å |
void | æ ç±»å |
| æ ¼å¼è¯´æç¬¦ | æ°æ®ç±»å |
|---|---|
%d æ %i | int æ´æ° |
%f | float å精度çåè¿å¶ç±»å |
%lf | double é«ç²¾åº¦æµ®ç¹æ°æ®ææ°å |
%c | char å符 |
%s | ç¨äº strings å符串 |
| short | int | long | |
|---|---|---|---|
| 8 è¿å¶ | %ho | %o | %lo |
| 10 è¿å¶ | %hd | %d | %ld |
| 16 è¿å¶ | %hx / %hX | %x / %X | %lx / %lX |
int myNum = 5;
float myFloatNum = 5.99; // æµ®ç¹æ°
char myLetter = 'D'; // å符串
// æå°è¾åºåé
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
| æä»¤ | æè¿° |
|---|---|
#define | å®ä¹å® |
#include | å å«ä¸ä¸ªæºä»£ç æä»¶ |
#undef | åæ¶å·²å®ä¹çå® |
#ifdef | 妿å®å·²ç»å®ä¹ï¼åè¿åç |
#ifndef | 妿宿²¡æå®ä¹ï¼åè¿åç |
#if | 妿ç»å®æ¡ä»¶ä¸ºçï¼åç¼è¯ä¸é¢ä»£ç |
#else | #if çæ¿ä»£æ¹æ¡ |
#elif | 妿 #if æ¡ä»¶ä¸ºåï¼å½åæ¡ä»¶ä¸ºç |
#endif | ç»æä¸ä¸ª #ifâ¦â¦#else æ¡ä»¶ç¼è¯å |
#error | å½éå°æ åé误æ¶ï¼è¾åºéè¯¯æ¶æ¯ |
#pragma | ä½¿ç¨æ ååæ¹æ³ï¼åç¼è¯å¨åå¸ç¹æ®çå½ä»¤å°ç¼è¯å¨ä¸ |
// ææç MAX_ARRAY_LENGTH æ¿æ¢ä¸º 20
#define MAX_ARRAY_LENGTH 20
// ç³»ç»åºä¸è·å stdio.h
#include <stdio.h>
// æ¬å°ç®å½ä¸è·å myheader.h
#include "myheader.h"
#undef FILE_SIZE
#define FILE_SIZE 42 // åæ¶å·²å®ä¹å¹¶å®ä¹ä¸º 42
| å® | æè¿° |
|---|---|
__DATE__ | å½åæ¥æï¼ä¸ä¸ªä»¥ "MMM DD YYYY" æ ¼å¼è¡¨ç¤ºçå符常é |
__TIME__ | å½åæ¶é´ï¼ä¸ä¸ªä»¥ "HH:MM:SS" æ ¼å¼è¡¨ç¤ºçå符常é |
__FILE__ | è¿ä¼å å«å½åæä»¶åï¼ä¸ä¸ªå符串常é |
__LINE__ | è¿ä¼å å«å½åè¡å·ï¼ä¸ä¸ªåè¿å¶å¸¸é |
__STDC__ | å½ç¼è¯å¨ä»¥ ANSI æ åç¼è¯æ¶ï¼åå®ä¹ä¸º 1 |
ANSI C å®ä¹äºè®¸å¤å®ï¼æ¨å¯ä»¥ä½¿ç¨è¿äºå®ï¼ä½æ¯ä¸è½ç´æ¥ä¿®æ¹è¿äºé¢å®ä¹çå®
#include <stdio.h>
int main() {
printf("File :%s\n", __FILE__);
printf("Date :%s\n", __DATE__);
printf("Time :%s\n", __TIME__);
printf("Line :%d\n", __LINE__);
printf("ANSI :%d\n", __STDC__);
}
ä¸ä¸ªå®é常åå¨ä¸ä¸ªåè¡ä¸ã
#define message_for(a, b) \
printf(#a " å " #b ": æä»¬ç±ä½ ï¼\n")
妿å®å¤ªé¿ï¼ä¸ä¸ªåè¡å®¹çº³ä¸ä¸ï¼å使ç¨å®å»¶ç»è¿ç®ç¬¦ \
#include <stdio.h>
#define message_for(a, b) \
printf(#a " å " #b ": æä»¬ç±ä½ ï¼\n")
int main(void) {
message_for(Carole, Debra);
return 0;
}
å½ä¸é¢ç代ç 被ç¼è¯åæ§è¡æ¶ï¼å®ä¼äº§çä¸åç»æï¼
Carole å Debra: æä»¬ç±ä½ ï¼
éè¦æä¸ä¸ªå®çåæ°è½¬æ¢ä¸ºåç¬¦ä¸²å¸¸éæ¶ï¼ä½¿ç¨å符串常éåè¿ç®ç¬¦ #
#include <stdio.h>
#define tokenpaster(n) \
printf ("token" #n " = %d", token##n)
int main(void){
int token34 = 40;
tokenpaster(34);
return 0;
}
#include <stdio.h>
#if !defined (MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void) {
printf("ä¿¡æ¯å¦ä¸: %s\n", \
MESSAGE);
return 0;
}
int square(int x) {
return x * x;
}
å®éåä¸é¢ç代ç ï¼å¦ä¸ï¼
#define square(x) ((x) * (x))
å®åç§°å左忬å·ä¹é´ä¸å 许æç©ºæ ¼
#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void) {
printf("20 å° 10 ä¹é´çæå¤§å¼æ¯ %d\n", \
MAX(10, 20));
return 0;
}
å¨ C è¯è¨ä¸ï¼è¦åï¼Warningï¼åé误ï¼Errorï¼æ¯ç¼è¯å¨ç¨äºæ è¯ä»£ç æ½å¨é®é¢æé»æ¢ä»£ç ç¼è¯çæºå¶ã
è¦åæç¤ºä»£ç ä¸å¯è½åå¨çé®é¢ï¼ä½ä¸ä¼é»æ¢ä»£ç ç¼è¯ãå¤çè¦åå¯ä»¥æå代ç è´¨éåå¯ç§»æ¤æ§ã
æªä½¿ç¨çåé
int x; printf("%d", x);
ç±»åéå¼è½¬æ¢ï¼å¯è½å¯¼è´æ°æ®ä¸¢å¤±ï¼
int x = 3.14; // æµ®ç¹æ°è¢«éå¼è½¬æ¢
int a = 2147483647 + 1; // å¯è½æº¢åº
彿°å£°æä¸å®ä¹ä¸å¹é
é误ä¼é»æ¢ä»£ç ç¼è¯ï¼å¿ é¡»ä¿®å¤æè½ç»§ç»ç¼è¯ã
常è§é误示ä¾ï¼
è¯æ³é误ï¼å¦ç¼ºå°åå·ï¼
int x = 1
彿°å®ä¹å²çª
void func(int);
void func(double);
彿°æåéæªå®ä¹
y = 10; printf("%d", y);
头æä»¶ç¼ºå¤±æå²çª
#include <unknown.h>
å¯ä»¥ä½¿ç¨ç¼è¯å¨é项æ¥å ³éç¹å®çè¦åï¼ä¾å¦å¨ GCC ä¸ï¼
gcc -w file.c # ç¦ç¨ææè¦å
gcc -Wall file.c # å¯ç¨ææå¸¸è§è¦å
gcc -Werror file.c # å°è¦åè§ä¸ºé误
#pragma æ§å¶è¦å卿äºç¼è¯å¨ä¸ï¼å¯ä»¥ä½¿ç¨ #pragma æä»¤å¯ç¨æç¦ç¨è¦åï¼
#include <stdio.h>
#pragma warning(disable : 4996) // ç¦ç¨è¦åï¼éç¨äº MSVC ç¼è¯å¨ï¼
int main() {
printf("Hello, world!");
return 0;
}
| åºå«ç¹ | Warningï¼è¦åï¼ | Errorï¼éè¯¯ï¼ |
|---|---|---|
| 严éç¨åº¦ | ç¨åºå¯ç»§ç»ç¼è¯ï¼ä½å¯è½åå¨éæ£ | ç¼è¯æ æ³å®æï¼å¿ é¡»ä¿®å¤ |
| ç¼è¯ç»æ | çæå¯æ§è¡æä»¶ | æ æ³çæå¯æ§è¡æä»¶ |
| 触ååå | æ½å¨é®é¢ï¼ä¾å¦éå¼è½¬æ¢ææªä½¿ç¨çåé | è¯æ³æè¯ä¹é误ï¼ä¾å¦è¯æ³éè¯¯ææªå®ä¹åé |
| ä¿®å¤å¿ è¦æ§ | å¯éæ©ä¿®å¤ï¼ä½å»ºè®®ä¿®å¤ä»¥é¿å æ½å¨é®é¢ | å¿ é¡»ä¿®å¤æè½ç»§ç»ç¼è¯ |
| ç¼è¯å¨éé¡¹è°æ´ | å¯ä»¥å¿½ç¥æè½¬æ¢ä¸ºé误ï¼å¦ -Werrorï¼ | æ æ³è°æ´ï¼å¿ é¡»ä¿®å¤ |
int main() {
printf("Hello World!");
return 0;
}
彿°ç±ä¸¤é¨åç»æ
void myFunction() { // 声æ declaration
// 彿°ä½ï¼è¦æ§è¡ç代ç ï¼(definition)
}
Declaration 声æå½æ°åç§°ãè¿åç±»åååæ° (妿æ)Definition 彿°ä½ (è¦æ§è¡ç代ç )// 彿°å£°æ
void myFunction();
// ä¸»è¦æ¹æ³
int main() {
myFunction(); // --> è°ç¨å½æ°
return 0;
}
void myFunction() {// 彿°å®ä¹
printf("æä¸å¥½ï¼");
}
// åå»ºå½æ°
void myFunction() {
printf("æä¸å¥½ï¼");
}
int main() {
myFunction(); // è°ç¨å½æ°
myFunction(); // å¯ä»¥è¢«å¤æ¬¡è°ç¨
return 0;
}
// è¾åº -> "æä¸å¥½ï¼"
// è¾åº -> "æä¸å¥½ï¼"
void myFunction(char name[]) {
printf("Hello %s\n", name);
}
int main() {
myFunction("Liam");
myFunction("Jenny");
return 0;
}
// Hello Liam
// Hello Jenny
void myFunction(char name[], int age) {
printf("ä½ å¥½ %s ä½ %d å²äºã\n",name,age);
}
int main() {
myFunction("Liam", 3);
myFunction("Jenny", 14);
return 0;
}
// ä½ å¥½ Liam ä½ 3 å²äºã
// ä½ å¥½ Jenny ä½ 14 å²äºã
int myFunction(int x) {
return 5 + x;
}
int main() {
printf("ç»æ: %d", myFunction(3));
return 0;
}
// è¾åº 8 (5 + 3)
ä¸¤ä¸ªåæ°
int myFunction(int x, int y) {
return x + y;
}
int main() {
printf("ç»æ: %d", myFunction(5, 3));
// å°ç»æåå¨å¨åéä¸
int result = myFunction(5, 3);
printf("ç»æ = %d", result);
return 0;
}
// ç»æ: 8 (5 + 3)
// ç»æ = 8 (5 + 3)
int sum(int k);
int main() {
int result = sum(10);
printf("%d", result);
return 0;
}
int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
#include <math.h>
printf("%f", sqrt(16)); // å¹³æ¹æ ¹
printf("%f", ceil(1.4)); // åèäºå
¥ (å
¥)
printf("%f", floor(1.4)); // åèäºå
¥ (è)
printf("%f", pow(4, 3)); // x(4)çy(3)次æ¹
abs(x) ç»å¯¹å¼acos(x) åä½å¼¦å¼asin(x) 忣弦å¼atan(x) 忣åcbrt(x) ç«æ¹æ ¹cos(x) ä½å¼¦exp(x) Ex çå¼sin(x) x çæ£å¼¦å¼tan(x) è§åº¦çæ£åstruct MyStructure { // ç»æå£°æ
int myNum; // æåï¼int åéï¼
char myLetter; // æåï¼char åéï¼
}; // ç¨åå·ç»æç»æ
å建ä¸ä¸ªå为 s1 çç»æåé
struct myStructure {
int myNum;
char myLetter;
};
int main() {
struct myStructure s1;
return 0;
}
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
strcpy(s1.myString, "Some text");
// æå°å¼
printf("æå符串: %s", s1.myString);
return 0;
}
ä½¿ç¨ strcpy 彿°ä¸ºå符串èµå¼
// å建ä¸ä¸ªå为 myStructure çç»æ
struct myStructure {
int myNum;
char myLetter;
};
int main() {
// å建ä¸ä¸ªå为 s1 ç myStructure ç»æåé
struct myStructure s1;
// 为 s1 çæåèµå¼
s1.myNum = 13;
s1.myLetter = 'B';
// å建ä¸ä¸ªå为 s2 ç myStructure ç»æåé
// 并为å
¶èµå¼
struct myStructure s2 = {13, 'B'};
// æå°å¼
printf("My number: %d\n", s1.myNum);
printf("My letter: %c\n", s1.myLetter);
return 0;
}
å建ä¸åçç»æåé
struct myStructure s1;
struct myStructure s2;
// 为ä¸åçç»æåéèµå¼
s1.myNum = 13;
s1.myLetter = 'B';
s2.myNum = 20;
s2.myLetter = 'C';
struct myStructure s1 = {
13, 'B', "Some text"
};
struct myStructure s2;
s2 = s1;
示ä¾ä¸ï¼å° s1 çå¼å¤å¶å° s2
// å建ä¸ä¸ªç»æåé并为å
¶èµå¼
struct myStructure s1 = {
13, 'B'
};
// ä¿®æ¹å¼
s1.myNum = 30;
s1.myLetter = 'C';
// æå°å¼
printf("%d %c %s",
s1.myNum,
s1.myLetter);
| 彿° | æè¿° Description |
|---|---|
fopen() | æå¼æ°æä»¶æç°ææä»¶ |
fprintf() | å°æ°æ®åå
¥æä»¶ |
fscanf() | 仿件ä¸è¯»åæ°æ® |
fputc() | å°ä¸ä¸ªå符åå
¥æä»¶ |
fgetc() | 仿件ä¸è¯»åä¸ä¸ªå符 |
fclose() | å
³éæä»¶ |
fseek() | å°æä»¶æé设置å°ç»å®ä½ç½® |
fputw() | å°æ´æ°åå
¥æä»¶ |
fgetw() | 仿件ä¸è¯»åä¸ä¸ªæ´æ° |
ftell() | è¿åå½åä½ç½® |
rewind() | å°æä»¶æé设置为æä»¶çå¼å¤´ |
C åºä¸æè®¸å¤å½æ°å¯ä»¥æå¼/读å/åå
¥/æç´¢åå
³éæä»¶
| æ¨¡å¼ Mode | æè¿° Description |
|---|---|
r | ä»¥è¯»åæ¨¡å¼æå¼ä¸ä¸ªææ¬æä»¶ï¼å
许读åæä»¶ |
w | 以忍¡å¼æå¼ä¸ä¸ªææ¬æä»¶ï¼å
许åå
¥æä»¶ |
a | ä»¥è¿½å æ¨¡å¼æå¼ä¸ä¸ªææ¬æä»¶å¦ææä»¶ä¸åå¨ï¼åä¼å建ä¸ä¸ªæ°æä»¶ |
r+ | ä»¥è¯»åæ¨¡å¼æå¼ä¸ä¸ªææ¬æä»¶ï¼å
许读åæä»¶ |
w+ | ä»¥è¯»åæ¨¡å¼æå¼ä¸ä¸ªææ¬æä»¶ï¼å
许读åæä»¶ |
a+ | ä»¥è¯»åæ¨¡å¼æå¼ä¸ä¸ªææ¬æä»¶ï¼å
许读åæä»¶ |
rb | ä»¥è¯»åæ¨¡å¼æå¼äºè¿å¶æä»¶ |
wb | 以åå
¥æ¨¡å¼æå¼äºè¿å¶æä»¶ |
ab | ä»¥è¿½å æ¨¡å¼æå¼äºè¿å¶æä»¶ |
rb+ | ä»¥è¯»åæ¨¡å¼æå¼äºè¿å¶æä»¶ |
wb+ | ä»¥è¯»åæ¨¡å¼æå¼äºè¿å¶æä»¶ |
ab+ | ä»¥è¯»åæ¨¡å¼æå¼äºè¿å¶æä»¶ |
#include<stdio.h>
void main( ) {
FILE *fp;
char ch;
fp = fopen("file_handle.c", "r");
while (1) {
ch = fgetc(fp);
if (ch == EOF)
break;
printf("%c", ch);
}
fclose(fp);
}
对æä»¶æ§è¡æææä½åï¼å¿
é¡»å
³é fclose() 该æä»¶
#include <stdio.h>
main() {
FILE *fp;
fp = fopen("file.txt", "w"); // æå¼æä»¶
// å°æ°æ®åå
¥æä»¶
fprintf(fp, "fprintf ç Hello æä»¶..\n");
fclose(fp); // å
³éæä»¶
}
#include <stdio.h>
main(){
FILE *fp;
char buff[255]; // å建charæ°ç»åå¨æä»¶æ°æ®
fp = fopen("file.txt", "r");
while(fscanf(fp, "%s", buff)!=EOF) {
printf("%s ", buff);
}
fclose(fp);
}
#include <stdio.h>
main(){
FILE *fp;
fp = fopen("file1.txt", "w"); // æå¼æä»¶
fputc('a',fp); // å°å个å符åå
¥æä»¶
fclose(fp); // å
³éæä»¶
}
#include<stdio.h>
#include<conio.h>
void main() {
FILE *fp;
char c;
clrscr();
fp=fopen("myfile.txt", "r");
while((c=fgetc(fp))!=EOF){
printf("%c", c);
}
fclose(fp);
getch();
}
#include<stdio.h>
#include<conio.h>
void main(){
FILE *fp;
clrscr();
fp = fopen("myfile2.txt","w");
fputs("hello c programming",fp);
fclose(fp);
getch();
}
#include<stdio.h>
#include<conio.h>
void main() {
FILE *fp;
char text[300];
clrscr();
fp=fopen("myfile2.txt", "r");
printf("%s", fgets(text, 200, fp));
fclose(fp);
getch();
}
#include <stdio.h>
void main(){
FILE *fp;
fp = fopen("myfile.txt","w+");
fputs("This is Book", fp);
// å°æä»¶æé设置å°ç»å®ä½ç½®
fseek(fp, 7, SEEK_SET);
fputs("Kenny Wong", fp);
fclose(fp);
}
å°æä»¶æé设置å°ç»å®ä½ç½®
#include<stdio.h>
#include<conio.h>
void main(){
FILE *fp;
char c;
clrscr();
fp=fopen("file.txt", "r");
while((c=fgetc(fp)) != EOF){
printf("%c", c);
}
rewind(fp); // å°æä»¶æéç§»å¨å°æä»¶çå¼å¤´
while((c=fgetc(fp)) != EOF){
printf("%c", c);
}
fclose(fp);
getch();
}
// è¾åº
// Hello World!Hello World!
#include <stdio.h>
#include <conio.h>
void main (){
FILE *fp;
int length;
clrscr();
fp = fopen("file.txt", "r");
fseek(fp, 0, SEEK_END);
length = ftell(fp); // è¿åå½åä½ç½®
fclose(fp);
printf("æä»¶å¤§å°: %d bytes", length);
getch();
}
// è¾åº
// æä»¶å¤§å°: 18 bytes
C使ç¨socketsè¿è¡ç½ç»éä¿¡ãå å«å¤´æä»¶ï¼
#include <sys/socket.h>: 奿¥åæä½ï¼å¦å建ãç»å®åçå¬å¥æ¥å#include <arpa/inet.h>: IP å°å转æ¢#include <unistd.h>: å
³é奿¥åç#include <netinet/in.h>: ç½ç»å°åç»æå®ä¹åç¸å
³æäº®ç½ç»éä¿¡çç¬¬ä¸æ¥æ¯åå»ºå¥æ¥åã奿¥åæ¯ç½ç»éä¿¡çåºç¡ï¼éè¿å®å¯ä»¥ä¸è¿ç¨ä¸»æºè¿è¡æ°æ®äº¤æ¢ã
int server_fd, new_socket; // å®ä¹æå¡å¨æä»¶æè¿°ç¬¦åæ°è¿æ¥ç奿¥å
int port = 8080; // æå¡å¨ä½¿ç¨ç端å£å·
// åå»ºå¥æ¥åæä»¶æè¿°ç¬¦
// AF_INET è¡¨ç¤ºä½¿ç¨ IPv4 åè®®ï¼SOCK_STREAM è¡¨ç¤ºä½¿ç¨ TCP åè®®ï¼åè®®åæ°é常为 0ï¼é»è®¤ TCPï¼
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
int sock = 0; // 客æ·ç«¯ç奿¥åæè¿°ç¬¦
struct sockaddr_in serv_addr; // å®ä¹æå¡å¨å°åç»æä½
// åå»ºå¥æ¥å
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
æå¡ç«¯åå»ºå¥æ¥ååï¼éè¦å°å ¶ç»å®å°ç¹å®ç IP å°åå端å£ï¼ä»¥ä¾¿å®¢æ·ç«¯è½å¤è¿æ¥ã
struct sockaddr_in address; // å®ä¹åå¨å°åä¿¡æ¯çç»æä½
address.sin_family = AF_INET; // 设置å°åæä¸º IPv4
address.sin_addr.s_addr = INADDR_ANY; // å°æå¡å¨ç»å®å°ææå¯ç¨çç½ç»æ¥å£ï¼å³æ¬æºçææ IP å°åï¼
address.sin_port = htons(port); // å°ç«¯å£å·è½¬æ¢ä¸ºç½ç»åèåºï¼å¤§ç«¯æ¨¡å¼
// å°å¥æ¥åç»å®å°æå®çå°åå端å£ä¸
// bind() å°æå¡å¨çæä»¶æè¿°ç¬¦ä¸ IP å°åå端å£å·è¿è¡ç»å®ï¼ä»¥ä¾¿å®¢æ·ç«¯è½å¤éè¿è¯¥å°åå端å£è®¿é®æå¡å¨
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
æå¡ç«¯å¨ç»å®å¥æ¥åä¹åï¼éè¦è¿å ¥çå¬ç¶æï¼ä»¥çå¾ å®¢æ·ç«¯çè¿æ¥è¯·æ±ã
// å¼å§çå¬å®¢æ·ç«¯è¿æ¥
// çå¬è¿æ¥è¯·æ±
// listen() 彿°å°å¥æ¥åè®¾ç½®ä¸ºè¢«å¨æ¨¡å¼ï¼å夿¥æ¶æ¥èªå®¢æ·ç«¯çè¿æ¥è¯·æ±
if (listen(server_fd, 3) < 0) { // 第äºä¸ªåæ° 3 è¡¨ç¤ºè¿æ¥è¯·æ±çéå大å°
perror("listen failed");
exit(EXIT_FAILURE);
}
int addrlen = sizeof(address); // è·åå°åç»æä½ç大å°
// accept() 彿°ä¼é»å¡çå¾
客æ·ç«¯çè¿æ¥è¯·æ±ï¼ä¸æ¦è¿æ¥è¯·æ±å°æ¥ï¼å建ä¸ä¸ªæ°ç奿¥å new_socket ç¨äºæ°æ®ä¼ è¾
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
客æ·ç«¯ä½¿ç¨ connect() 彿°è¿æ¥å°æå¡å¨ç IP å°åå端å£ã
// 设置æå¡å¨å°å
serv_addr.sin_family = AF_INET; // 设置å°åæä¸º IPv4
serv_addr.sin_port = htons(port); // å°ç«¯å£å·è½¬æ¢ä¸ºç½ç»åèåº
// å° IP å°å转æ¢ä¸ºäºè¿å¶å¹¶åå¨å¨ serv_addr ç»æä½ä¸
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
perror("Invalid address/ Address not supported");
exit(EXIT_FAILURE);
}
// è¿æ¥æå¡å¨
// connect() 彿°å°å®¢æ·ç«¯ç奿¥å䏿å¡å¨çå°åç»å®ï¼ä»è建ç«è¿æ¥
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Connection Failed");
exit(EXIT_FAILURE);
}
䏿¦è¿æ¥å»ºç«ï¼æå¡ç«¯å客æ·ç«¯å¯ä»¥éè¿å¥æ¥ååéåæ¥æ¶æ°æ®ã
// æå¡ç«¯ä»å®¢æ·ç«¯æ¥æ¶æ°æ®
char buffer[1024] = {0}; // ç¼å²åºï¼ç¨äºå卿¥æ¶çæ°æ®
int valread = read(new_socket, buffer, 1024); // ä»å®¢æ·ç«¯è¯»åæ°æ®
printf("Client: %s\n", buffer); // æå°æ¥æ¶å°ç客æ·ç«¯æ°æ®
// æå¡ç«¯åéååºæ°æ®ç»å®¢æ·ç«¯
const char *response = "Hello from server"; // ååºæ¶æ¯
send(new_socket, response, strlen(response), 0); // åéæ°æ®å°å®¢æ·ç«¯
printf("Server message sent\n");
// 客æ·ç«¯åéæ°æ®ç»æå¡ç«¯
const char *message = "Hello from client"; // è¦åéçæ¶æ¯
send(sock, message, strlen(message), 0); // åéæ°æ®å°æå¡ç«¯
printf("Client message sent\n");
// 客æ·ç«¯ä»æå¡ç«¯æ¥æ¶ååºæ°æ®
char buffer[1024] = {0}; // ç¼å²åºï¼ç¨äºå卿¥æ¶å°çæ°æ®
int valread = read(sock, buffer, 1024); // 读åæå¡ç«¯çååºæ°æ®
printf("Server: %s\n", buffer); // æå°æ¥æ¶å°çæå¡ç«¯æ°æ®
宿éä¿¡åï¼åæ¹é½åºå ³éåèªç奿¥åä»¥éæ¾èµæºã
// å
³éæå¡ç«¯å¥æ¥å
close(new_socket); // å
³éç¨äºæ°æ®ä¼ è¾ç客æ·ç«¯å¥æ¥å
close(server_fd); // å
³éæå¡å¨ççå¬å¥æ¥å
// å
³é客æ·ç«¯å¥æ¥å
close(sock); // å
³é客æ·ç«¯ç奿¥å
å¨ç½ç»ç¼ç¨ä¸ï¼æå¡ç«¯å¯ä»¥ä½¿ç¨ I/O å¤è·¯å¤ç¨ ææ¯ï¼å¦ selectãpoll æ epollãè¿äºææ¯å
许æå¡ç«¯åæ¶çå¬å¤ä¸ªæä»¶æè¿°ç¬¦ï¼å¦å¥æ¥åï¼ï¼å¹¶å¨å
¶ä¸ä¸ä¸ªåçäºä»¶æ¶è¿è¡å¤çï¼æåç³»ç»æçãå
å«å¤´æä»¶ï¼
#include <sys/select.h>: æä¾ select#include <poll.h>: æä¾ poll#include <sys/epoll.h>: æä¾epollfd_set read_fds; // å®ä¹æä»¶æè¿°ç¬¦éå
FD_ZERO(&read_fds); // æ¸
空éå
FD_SET(server_socket, &read_fds); // å°æå¡ç«¯å¥æ¥åå å
¥éå
int max_fd = server_socket;
int activity = select(max_fd + 1, &read_fds, NULL, NULL, NULL); // çå¾
äºä»¶åç
if (activity < 0 && errno != EINTR) {
perror("select error");
}
struct pollfd fds[2]; // å®ä¹æä»¶æè¿°ç¬¦æ°ç»
fds[0].fd = server_socket;
fds[0].events = POLLIN; // çå¬è¯»äºä»¶
int poll_count = poll(fds, 2, -1); // çå¾
äºä»¶
if (poll_count < 0) {
perror("poll error");
}
int epoll_fd = epoll_create1(0); // å建 epoll æä»¶æè¿°ç¬¦
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = server_socket;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_socket, &event) == -1) {
perror("epoll_ctl failed");
}
struct epoll_event events[10]; // äºä»¶æ°ç»
int event_count = epoll_wait(epoll_fd, events, 10, -1); // çå¾
äºä»¶åç
for (int i = 0; i < event_count; i++) {
if (events[i].data.fd == server_socket) {
// å¤çæå¡ç«¯å¥æ¥åä¸çäºä»¶
}
}
å®è£
Docker
å建 Dockerfile æä»¶
FROM alpine:3.14
RUN apk add --no-cache gcc musl-dev
RUN apk add --no-cache g++
çææ¬å° myalpine éå
docker build -t myalpine .
è¿è¡æ åï¼æå½åè·¯å¾ ($PWD) æ å°è³å®¹å¨ç /test ç®å½ï¼ç¨ gcc ç¼è¯ç¨åºï¼exitè¿å
docker run -it -v $PWD:/test myalpine
root@b1a38bd7107a:/# cd test
root@b1a38bd7107a:/test# gcc -o hello hello.c
Hello World
root@b1a38bd7107a:/test# exit
exit