国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片

C 備忘清單

提供基本語(yǔ)法和方法的 C 快速參考備忘單。

入門

hello.c

#include <stdio.h>

int main() {
  printf("Hello World!");
  return 0;
}

使用 gcc 編譯 hello.c 文件

$ gcc -o hello hello.c

運(yùn)行編譯后的二進(jìn)制文件(hello)

$ ./hello
# 輸出 => Hello World

變量

int myNum = 15;

int myNum2; // 不賦值,然后再賦值
myNum2 = 15;

int myNum3 = 15;  // myNum3 值為 15
myNum3 = 10;      // 現(xiàn)在 myNum3 值為 10

float myFloatNum = 5.99; // 浮點(diǎn)數(shù)
char myLetter = 'D';     // 字符

int x = 5;
int y = 6;
int sum = x + y;  // 添加變量相加
// 聲明多個(gè)變量
int x = 5, y = 6, z = 50;

常量 Constants

const int minutesPerHour = 60;
const float PI = 3.14;

最佳實(shí)踐

const int BIRTHYEAR = 1980;

注釋

// 這是一個(gè)注釋
printf("Hello World!"); // 這是一個(gè)注釋
/* 多行注釋,上面的代碼將打印出 Hello World!
到屏幕上,真是太棒了 */

打印文本

printf("I am learning C.");
int testInteger = 5;
printf("Number = %d", testInteger);

float f = 5.99; // 浮點(diǎn)數(shù)
printf("Value = %f", f);

short a = 0b1010110;  // 2 進(jìn)制數(shù)字
int b = 02713;        // 8 進(jìn)制數(shù)字
long c = 0X1DAB83;    // 16 進(jìn)制數(shù)字

// 以 8 進(jìn)制形似輸出
printf("a=%ho, b=%o, c=%lo\n", a, b, c);
// 輸出 => a=126, b=2713, c=7325603

// 以 10 進(jìn)制形式輸出
printf("a=%hd, b=%d, c=%ld\n", a, b, c);
// 輸出 => a=86, b=1483, c=1944451

// 以 16 進(jìn)制形式輸出(字母小寫)
printf("a=%hx, b=%x, c=%lx\n", a, b, c);
// 輸出 => a=56, b=5cb, c=1dab83

// 以 16 進(jìn)制形式輸出(字母大寫)
printf("a=%hX, b=%X, c=%lX\n", a, b, c);
// 輸出 => a=56, b=5CB, c=1DAB83

控制空格數(shù)

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;

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

輸出結(jié)果

20        345       700  
56720     9999      20098
233       205       1    
34        0         23   

%-9d 中,d 表示以 10 進(jìn)制輸出,9 表示最少占 9 個(gè)字符的寬度,寬度不足以空格補(bǔ)齊,- 表示左對(duì)齊

字符串 Strings

char greetings[] = "Hello World!";
printf("%s", greetings);

訪問(wèn)字符串

char greetings[] = "Hello World!";
printf("%c", greetings[0]);

修改字符串

char greetings[] = "Hello World!";
greetings[0] = 'J';

printf("%s", greetings);
// 輸出 "Jello World!"

另一種創(chuàng)建字符串的方法

char greetings[] = {'H','e','l','l','\0'};

printf("%s", greetings);
// 輸出 "Hell!"

C 沒(méi)有 String 類型,使用 char 類型并創(chuàng)建一個(gè)字符 array

條件判斷

int time = 20;
if (time < 18) {
  printf("再會(huì)!");
} else {
  printf("晚上好!");
}
// 輸出 -> "晚上好!"
int time = 22;
if (time < 10) {
  printf("早上好!");
} else if (time < 20) {
  printf("再會(huì)!");
} else {
  printf("晚上好!");
}
// 輸出 -> "晚上好!"

三元運(yùn)算符

int time = 20;
(time < 18) ? printf("再會(huì)!") : printf("晚上好!");

Switch

int day = 4;

switch (day) {
  case 3: printf("周三"); break;
  case 4: printf("周四"); break;
  default:
    printf("期待周末");
}
// 輸出 -> "周四" (day 4)

While 循環(huán)

int i = 0;

while (i < 5) {
  printf("%d\n", i);
  i++;
}

注意:不要忘記增加條件中使用的變量,否則循環(huán)永遠(yuǎn)不會(huì)結(jié)束,成為“死循環(huán)”!

Do/While 循環(huán)

int i = 0;

do {
  printf("%d\n", i);
  i++;
} while (i < 5);

For 循環(huán)

int i;

for (i = 0; i < 5; i++) {
  printf("%d\n", i);
}

跳出循環(huán) Break/Continue

int i;

for (i = 0; i < 10; i++) {
  if (i == 4) {
    break;
  }
  printf("%d\n", i);
}

i 等于 4 時(shí)跳出循環(huán)

int i;

for (i = 0; i < 10; i++) {
  if (i == 4) {
    continue;
  }
  printf("%d\n", i);
}

示例跳過(guò) 4 的值

While Break 示例

int i = 0;

while (i < 10) {
  if (i == 4) {
    break;
  }
  printf("%d\n", i);
  i++;
}

While continue 示例

int i = 0;

while (i < 10) {
  i++;
  if (i == 4) {
    continue;
  }
  printf("%d\n", i);
}

數(shù)組 Arrays

int myNumbers[] = {25, 50, 75, 100};
printf("%d", myNumbers[0]);
// 輸出 25

更改數(shù)組元素

int myNumbers[] = {25, 50, 75, 100};
myNumbers[0] = 33;

printf("%d", myNumbers[0]);

循環(huán)遍歷數(shù)組

int myNumbers[] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

設(shè)置數(shù)組大小

// 聲明一個(gè)由四個(gè)整數(shù)組成的數(shù)組:
int myNumbers[4];
// 添加元素
myNumbers[0] = 25;
myNumbers[1] = 50;
myNumbers[2] = 75;
myNumbers[3] = 100;

枚舉 Enum

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;

枚舉示例應(yīng)用

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!");
}

用戶輸入

// 創(chuàng)建一個(gè)整數(shù)變量來(lái)存儲(chǔ)我們從用戶那里得到的數(shù)字
int myNum;

// 要求用戶輸入一個(gè)數(shù)字
printf("請(qǐng)輸入一個(gè)數(shù)字: \n");

// 獲取并保存用戶輸入的號(hào)碼
scanf("%d", &myNum);

// 輸出用戶輸入的數(shù)字
printf("您輸入的數(shù)字: %d", myNum);

用戶輸入字符串

// 創(chuàng)建一個(gè)字符串
char firstName[30];
// 要求用戶輸入一些文本
printf("輸入您的名字: \n");
// 獲取并保存文本
scanf("%s", firstName);
// 輸出文本
printf("Hello %s.", firstName);

內(nèi)存地址

創(chuàng)建變量時(shí),會(huì)為該變量分配一個(gè)內(nèi)存地址

int myAge = 43;

printf("%p", &myAge);
// 輸出:0x7ffe5367e044

要訪問(wèn)它,請(qǐng)使用引用運(yùn)算符 (&)

創(chuàng)建指針

int myAge = 43;      // 一個(gè) int 變量
printf("%d", myAge); // 輸出 myAge(43)的值

// 輸出 myAge 的內(nèi)存地址(0x7ffe5367e044)
printf("%p", &myAge);

指針變量

int myAge = 43;            // 一個(gè) int 變量
int* ptr = &myAge;         // 名為 ptr 的指針變量,用于存儲(chǔ) myAge 的地址

printf("%d\n", myAge);     // 輸出 myAge (43) 的值

printf("%p\n", \&myAge);   // 輸出 myAge 的內(nèi)存地址(0x7ffe5367e044)

printf("%p\n", ptr);       // 用指針(0x7ffe5367e044)輸出myAge的內(nèi)存地址

取消引用

int myAge = 43;     // 變量聲明
int* ptr = &myAge;  // 指針聲明

// 參考:用指針輸出 myAge 的
// 內(nèi)存地址(0x7ffe5367e044)
printf("%p\n", ptr);
// 取消引用:用指針輸出 myAge 的值 (43)
printf("%d\n", *ptr);

運(yùn)算符

算術(shù)運(yùn)算符

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)

OperatorNameDescriptionExample
+將兩個(gè)值相加x + y
-從另一個(gè)值中減去一個(gè)值x - y
*將兩個(gè)值相乘x * y
/將一個(gè)值除以另一個(gè)x / y
%取模返回除法余數(shù)x % y
++增量將變量的值增加 1++
--乘量將變量的值減 1--x

賦值運(yùn)算符

符號(hào)示例如同
=x = 5x = 5
+=x += 3x = x + 3
-=x -= 3x = x - 3
*=x *= 3x = x * 3
/=x /= 3x = x / 3
%=x %= 3x = x % 3
&=x &= 3x = x & 3
|=x |= 3x = x | 3
^=x ^= 3x = x ^ 3
>>=x >>= 3x = x >> 3
<<=x <<= 3x = x << 3

比較運(yùn)算符

int x = 5;
int y = 3;

printf("%d", x > y);
// 返回 1(真),因?yàn)?5 大于 3

符號(hào)名稱示例
==等于x == y
!=不等于x != y
>大于x > y
<小于x < y
>=大于或等于x >= y
<=小于或等于x <= y

比較運(yùn)算符用于比較兩個(gè)值

邏輯運(yùn)算符

符號(hào)名稱說(shuō)明示例
&&邏輯如果兩個(gè)語(yǔ)句都為真,則返回真x < 5 && x < 10
||邏輯如果其中一個(gè)語(yǔ)句為真,則返回真x < 5 || x < 4
!邏輯反轉(zhuǎn)結(jié)果,如果結(jié)果為真則返回假!(x < 5 && x < 10)

運(yùn)算符示例

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

位運(yùn)算符

運(yùn)算符描述實(shí)例
&按位與操作,按二進(jìn)制位進(jìn)行"與"運(yùn)算(A & B) 將得到 12 即為 0000 1100
|按位或運(yùn)算符,按二進(jìn)制位進(jìn)行"或"運(yùn)算(A | B) 將得到 61 即為 0011 1101
^異或運(yùn)算符,按二進(jìn)制位進(jìn)行"異或"運(yùn)算(A ^ B) 將得到 49 即為 0011 0001
~取反運(yùn)算符,按二進(jìn)制位進(jìn)行"取反"運(yùn)算(~A) 將得到 -61 即為 1100 0011
<<二進(jìn)制左移運(yùn)算符A << 2 將得到 240 即為 1111 0000
>>二進(jìn)制右移運(yùn)算符A >> 2 將得到 15 即為 0000 1111

數(shù)據(jù)類型 Data Types

基本數(shù)據(jù)類型

數(shù)據(jù)類型大小 Size范圍 Range描述 Description
char1 字節(jié)?128 ~ 127單個(gè)字符/字母/數(shù)字/ASCII
signed char1 字節(jié)?128 ~ 127-
unsigned char1 字節(jié)0 ~ 255-
int24 字節(jié)?32,768 ~ 32,767存儲(chǔ)整數(shù)
signed int2 字節(jié)?32,768 ~ 32,767
unsigned int2 字節(jié)0 ~ 65,535
short int2 字節(jié)?32,768 ~ 32,767
signed short int2 字節(jié)?32,768 ~ 32,767
unsigned short int2 字節(jié)0 ~ 65,535
long int4 字節(jié)-2,147,483,648 ~ 2,147,483,647
signed long int4 字節(jié)-2,147,483,648 ~ 2,147,483,647
unsigned long int4 字節(jié)0 ~ 4,294,967,295
float4 字節(jié)
double8 字節(jié)
long double10 字節(jié)

數(shù)據(jù)類型

// 創(chuàng)建變量
int myNum = 5;             // 整數(shù)
float myFloatNum = 5.99;   // 浮點(diǎn)數(shù)
char myLetter = 'D';       // 字符串
// 高精度浮點(diǎn)數(shù)據(jù)或數(shù)字
double myDouble = 3.2325467;
// 打印輸出變量
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
printf("%lf\n", myDouble);

數(shù)據(jù)類型說(shuō) 明
char字符型
short短整型
int整型
long長(zhǎng)整型
float單精度浮點(diǎn)型
double雙精度浮點(diǎn)型
void無(wú)類型

基本格式說(shuō)明符

格式說(shuō)明符數(shù)據(jù)類型
%d%iint 整數(shù)
%ffloat 單精度的十進(jìn)制類型
%lfdouble 高精度浮點(diǎn)數(shù)據(jù)或數(shù)字
%cchar 字符
%s用于 strings 字符串

基本格式說(shuō)明符

shortintlong
8 進(jìn)制%ho%o%lo
10 進(jìn)制%hd%d%ld
16 進(jìn)制%hx / %hX%x / %X%lx / %lX

數(shù)據(jù)格式示例

int myNum = 5;
float myFloatNum = 5.99; // 浮點(diǎn)數(shù)
char myLetter = 'D';     // 字符串
// 打印輸出變量
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);

預(yù)處理器

預(yù)處理器指令

指令描述
#define定義宏
#include包含一個(gè)源代碼文件
#undef取消已定義的宏
#ifdef如果宏已經(jīng)定義,則返回真
#ifndef如果宏沒(méi)有定義,則返回真
#if如果給定條件為真,則編譯下面代碼
#else#if 的替代方案
#elif如果 #if 條件為假,當(dāng)前條件為
#endif結(jié)束一個(gè) #if……#else 條件編譯塊
#error當(dāng)遇到標(biāo)準(zhǔn)錯(cuò)誤時(shí),輸出錯(cuò)誤消息
#pragma使用標(biāo)準(zhǔn)化方法,向編譯器發(fā)布特殊的命令到編譯器中
// 所有的 MAX_ARRAY_LENGTH 替換為 20
#define MAX_ARRAY_LENGTH 20
// 系統(tǒng)庫(kù)中獲取 stdio.h
#include <stdio.h>
// 本地目錄中獲取 myheader.h
#include "myheader.h"
#undef  FILE_SIZE
#define FILE_SIZE 42 // 取消已定義并定義為 42

預(yù)定義宏

描述
__DATE__當(dāng)前日期,一個(gè)以 "MMM DD YYYY" 格式表示的字符常量
__TIME__當(dāng)前時(shí)間,一個(gè)以 "HH:MM:SS" 格式表示的字符常量
__FILE__這會(huì)包含當(dāng)前文件名,一個(gè)字符串常量
__LINE__這會(huì)包含當(dāng)前行號(hào),一個(gè)十進(jìn)制常量
__STDC__當(dāng)編譯器以 ANSI 標(biāo)準(zhǔn)編譯時(shí),則定義為 1

ANSI C 定義了許多宏,您可以使用這些宏,但是不能直接修改這些預(yù)定義的宏

預(yù)定義宏示例

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

宏延續(xù)運(yùn)算符(\)

一個(gè)宏通常寫在一個(gè)單行上。

#define  message_for(a, b)  \
    printf(#a " 和 " #b ": 我們愛(ài)你!\n")

如果宏太長(zhǎng),一個(gè)單行容納不下,則使用宏延續(xù)運(yùn)算符 \

字符串常量化運(yùn)算符(#)

#include <stdio.h>

#define  message_for(a, b)  \
  printf(#a " 和 " #b ": 我們愛(ài)你!\n")

int main(void) {
  message_for(Carole, Debra);
  return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Carole 和 Debra: 我們愛(ài)你!

需要把一個(gè)宏的參數(shù)轉(zhuǎn)換為字符串常量時(shí),使用字符串常量化運(yùn)算符 #

標(biāo)記粘貼運(yùn)算符(##)

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void){
  int token34 = 40;
  tokenpaster(34);
  return 0;
}

defined() 運(yùn)算符

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void) {
  printf("Here is the message: %s\n", MESSAGE);  
  return 0;
}

參數(shù)化的宏

int square(int x) {
   return x * x;
}

宏重寫上面的代碼,如下:

#define square(x) ((x) * (x))

宏名稱和左圓括號(hào)之間不允許有空格

#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void) {
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

函數(shù)

函數(shù)聲明和定義

int main() {
  printf("Hello World!");
  return 0;
}

函數(shù)由兩部分組成

void myFunction() { // 聲明 declaration
  // 函數(shù)體(要執(zhí)行的代碼)(definition)
}

  • Declaration 聲明函數(shù)名稱、返回類型和參數(shù) (如果有)
  • Definition 函數(shù)體 (要執(zhí)行的代碼)

// 函數(shù)聲明
void myFunction();
// 主要方法
int main() {
  myFunction(); // --> 調(diào)用函數(shù)
  return 0;
}
void myFunction() {// 函數(shù)定義
  printf("晚上好!");
}

調(diào)用函數(shù)

// 創(chuàng)建函數(shù)
void myFunction() {
  printf("晚上好!");
}
int main() {
  myFunction();  // 調(diào)用函數(shù)
  myFunction();  // 可以被多次調(diào)用
  return 0;
}
// 輸出 -> "晚上好!"
// 輸出 -> "晚上好!"

函數(shù)參數(shù)

void myFunction(char name[]) {
  printf("Hello %s\n", name);
}
int main() {
  myFunction("Liam");
  myFunction("Jenny");
  return 0;
}
// Hello Liam
// Hello Jenny

多個(gè)參數(shù)

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("結(jié)果: %d", myFunction(3));
  return 0;
}
// 輸出 8 (5 + 3)

兩個(gè)參數(shù)

int myFunction(int x, int y) {
  return x + y;
}

int main() {
  printf("結(jié)果: %d", myFunction(5, 3));
  // 將結(jié)果存儲(chǔ)在變量中
  int result = myFunction(5, 3);
  printf("結(jié)果 = %d", result);
  return 0;
}
// 結(jié)果: 8 (5 + 3)
// 結(jié)果 = 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;
  }
}

數(shù)學(xué)函數(shù)

#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) 絕對(duì)值
  • acos(x) 反余弦值
  • asin(x) 反正弦值
  • atan(x) 反正切
  • cbrt(x) 立方根
  • cos(x) 余弦
  • exp(x) Ex 的值
  • sin(x) x 的正弦值
  • tan(x) 角度的正切

Structures 結(jié)構(gòu)

創(chuàng)建結(jié)構(gòu)

struct MyStructure {  // 結(jié)構(gòu)聲明
  int myNum;     // 成員(int 變量)
  char myLetter; // 成員(char 變量)
}; // 用分號(hào)結(jié)束結(jié)構(gòu)

創(chuàng)建一個(gè)名為 s1 的結(jié)構(gòu)變量

struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  struct myStructure s1;
  return 0;
}

結(jié)構(gòu)中的字符串

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 函數(shù)為字符串賦值

訪問(wèn)結(jié)構(gòu)成員

// 創(chuàng)建一個(gè)名為 myStructure 的結(jié)構(gòu)
struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  // 創(chuàng)建一個(gè)名為 s1 的 myStructure 結(jié)構(gòu)變量
  struct myStructure s1;
  // 為 s1 的成員賦值
  s1.myNum = 13;
  s1.myLetter = 'B';

  // 創(chuàng)建一個(gè)名為 s2 的 myStructure 結(jié)構(gòu)變量
  // 并為其賦值
  struct myStructure s2 = {13, 'B'};
  // 打印值
  printf("My number: %d\n", s1.myNum);
  printf("My letter: %c\n", s1.myLetter);
  return 0;
}

創(chuàng)建不同的結(jié)構(gòu)變量

struct myStructure s1;
struct myStructure s2;
// 為不同的結(jié)構(gòu)變量賦值
s1.myNum = 13;
s1.myLetter = 'B';

s2.myNum = 20;
s2.myLetter = 'C';

復(fù)制結(jié)構(gòu)

struct myStructure s1 = {
  13, 'B', "Some text"
};

struct myStructure s2;
s2 = s1;

示例中,將 s1 的值復(fù)制到 s2

修改值

// 創(chuàng)建一個(gè)結(jié)構(gòu)變量并為其賦值
struct myStructure s1 = {
  13, 'B'
};
// 修改值
s1.myNum = 30;
s1.myLetter = 'C';
// 打印值
printf("%d %c %s",
    s1.myNum,
    s1.myLetter);

文件處理

文件處理函數(shù)

函數(shù)描述 Description
fopen()打開(kāi)新文件或現(xiàn)有文件
fprintf()將數(shù)據(jù)寫入文件
fscanf()從文件中讀取數(shù)據(jù)
fputc()將一個(gè)字符寫入文件
fgetc()從文件中讀取一個(gè)字符
fclose()關(guān)閉文件
fseek()將文件指針設(shè)置到給定位置
fputw()將整數(shù)寫入文件
fgetw()從文件中讀取一個(gè)整數(shù)
ftell()返回當(dāng)前位置
rewind()將文件指針設(shè)置為文件的開(kāi)頭

C 庫(kù)中有許多函數(shù)可以打開(kāi)/讀取/寫入/搜索關(guān)閉文件

打開(kāi)模式參數(shù)

模式 Mode描述 Description
r讀取模式打開(kāi)一個(gè)文本文件,允許讀取文件
w模式打開(kāi)一個(gè)文本文件,允許寫入文件
a追加模式打開(kāi)一個(gè)文本文件
如果文件不存在,則會(huì)創(chuàng)建一個(gè)新文件
r+讀寫模式打開(kāi)一個(gè)文本文件,允許讀寫文件
w+讀寫模式打開(kāi)一個(gè)文本文件,允許讀寫文件
a+讀寫模式打開(kāi)一個(gè)文本文件,允許讀寫文件
rb讀取模式打開(kāi)二進(jìn)制文件
wb寫入模式打開(kāi)二進(jìn)制文件
ab追加模式打開(kāi)二進(jìn)制文件
rb+讀寫模式打開(kāi)二進(jìn)制文件
wb+讀寫模式打開(kāi)二進(jìn)制文件
ab+讀寫模式打開(kāi)二進(jìn)制文件

打開(kāi)文件:fopen()

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

對(duì)文件執(zhí)行所有操作后,必須關(guān)閉 fclose() 該文件

寫入文件:fprintf()

#include <stdio.h>

main() {
  FILE *fp;
  fp = fopen("file.txt", "w"); // 打開(kāi)文件
  // 將數(shù)據(jù)寫入文件
  fprintf(fp, "fprintf 的 Hello 文件..\n");
  fclose(fp); // 關(guān)閉文件  
}  

讀取文件:fscanf()

#include <stdio.h>  
main(){
  FILE *fp;
  char buff[255]; // 創(chuàng)建char數(shù)組存儲(chǔ)文件數(shù)據(jù)
  fp = fopen("file.txt", "r");
  while(fscanf(fp, "%s", buff)!=EOF) {
    printf("%s ", buff);
  }
  fclose(fp);
}

寫入文件:fputc()

#include <stdio.h>

main(){
  FILE *fp;
  fp = fopen("file1.txt", "w"); // 打開(kāi)文件
  fputc('a',fp); // 將單個(gè)字符寫入文件
  fclose(fp);    // 關(guān)閉文件
}

讀取文件:fgetc()

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

寫入文件:fputs()

#include<stdio.h>
#include<conio.h>

void main(){
  FILE *fp;
  clrscr();
  fp = fopen("myfile2.txt","w");
  fputs("hello c programming",fp);
  fclose(fp);
  getch();
}

讀取文件:fgets()

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

fseek()

#include <stdio.h>
void main(){
  FILE *fp;
  fp = fopen("myfile.txt","w+");
  fputs("This is Book", fp);

  // 將文件指針設(shè)置到給定位置
  fseek(fp, 7, SEEK_SET);
  fputs("Kenny Wong", fp);
  fclose(fp);
}

將文件指針設(shè)置到給定位置

rewind()

#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); // 將文件指針移動(dòng)到文件的開(kāi)頭
  while((c=fgetc(fp)) != EOF){
    printf("%c", c);
  }
  fclose(fp);
  getch();
}
// 輸出
// Hello World!Hello World!

ftell()

#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); // 返回當(dāng)前位置

   fclose(fp);
   printf("文件大小: %d bytes", length);
   getch();
}
// 輸出
// 文件大小: 18 bytes

雜項(xiàng)

Docker 運(yùn)行環(huán)境

  • 安裝 Docker

  • 創(chuàng)建 Dockerfile 文件

    FROM alpine:3.14
    RUN apk add --no-cache gcc musl-dev
    RUN apk add --no-cache g++
    
  • 生成本地 myalpine 鏡像

    docker build -t myalpine .
    
  • 運(yùn)行映像,把當(dāng)前路徑 ($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
    

另見(jiàn)