Cprogramming 简明教程

C Language - Cheat Sheet

本 C 语言备忘单从基础到高级水平快速概述了 C 语言概念。此备忘单非常适用于学生、开发人员和准备面试的人员。浏览本备忘单了解 C programming language. 的所有基本和高级概念

c language cheatsheet

Basis Structure of C Program

basic structure of a C program 让您了解在 C 语言中编写程序所需使用的基本语句。以下是 C 程序的基本结构 -

// Preprocessor directive/header file inclusion section
#include <stdio.h>

// Global declaration section

// the main() function
int main() {
   // Variable declarations section
   int x, y;

   // other code statements section

   // Return o
   return 0;
}
// Other user-defined function definition section

#include 是在 C 程序中包含头文件的预处理器指令。 stdio.h 是定义所有输入和输出相关函数的头文件。 = main() 函数[id="_main_function"]==== main() 函数 main() function 是 C 程序的入口点,程序的执行从 main() 函数开始。 以下是 main() 函数的语法 -

int main() {
   return 0;
}

= 注释[id="_comments"]=== 注释 有两种类型的 comments in C language. 单行注释和多行注释。注释被编译器忽略。 = 单行注释[id="_single_line_comments"]==== 单行注释 使用 // 撰写单行注释。

// This is a single-line comment

= 多行注释[id="_multi_line_comments"]==== 多行注释 在文本前后使用 /* 和 */ 在 C 语言中编写多行注释。

/*
This is line 1
This is line 2
..
*/

= 打印 (printf() 函数)[id="_printing_printf_function"]=== 打印 (printf() 函数) printf() 函数是库函数,用于在控制台输出上打印格式化的文本。当您需要打印任何内容时,请使用 printf()。 = 示例[id="_example"]====示例

printf("Hello world");

= 用户输入 (scanf() 函数)[id="_user_input_scanf_function"]=== 用户输入 (scanf() 函数) scanf() 函数用于从用户获取各种类型的输入。 下面是 scanf() 函数的语法:

scanf("format_specifier", &variable_name);

= 格式说明符[id="_format_specifiers"]==== 格式说明符 以下是 printf()scanf() 函数中使用的 C 格式说明符,用于打印/输入特定类型的值。

Format Specifier

Type

%c

Character

%d

Signed integer

%e or %E

Scientific notation of floats

%f

Float values

%g or %G

与 %e 或 %E 类似

%hi

Signed integer (short)

%hu

Unsigned Integer (short)

%i

Unsigned integer

%l 或 %ld 或 %li

Long

%lf

Double

%Lf

Long double

%lu

无符号int 或无符号 long

%lli or %lld

Long long

%llu

Unsigned long long

%o

Octal representation

%p

Pointer

%s

String

%u

Unsigned int

%x or %X

Hexadecimal representation

= 示例[id="_example"]====示例

#include <stdio.h>

int main(){

   int age = 18;

   float percent = 67.75;

   printf("Age: %d \nPercent: %f", age, percent);

   return 0;
}
Age: 18
Percent: 67.750000

= 数据类型[id="_data_types"]=== 数据类型 data types 指定存储在变量中的数据类型和大小。数据类型分为 3 个部分:

  1. Basic Data Types

  2. Derived Data Types

  3. User-defined Data Types

= 基本数据类型[id="_basic_data_types"]==== 基本数据类型 基本数据类型是 C 语言中的内置数据类型,也可以用于创建派生数据类型。

Data Type

Name

Description

int

Integer

Represents integer Value

char

Character

Represents a single character

float

Float

Represents float value

= 派生数据类型[id="_derived_data_types"]==== 派生数据类型 派生数据类型是从基本数据类型派生的。派生数据类型包括:

  1. Array

  2. Pointer

= 用户定义数据类型[id="_user_defined_data_types"]==== 用户定义数据类型 用户定义数据类型由程序员创建,用于处理不同类型的数据,并基于需求。用户定义数据类型包括:

  1. Structures

  2. Unions

  3. Enumerations

= 基本输入和输出[id="_basic_input_output"]=== 基本输入和输出 对于 basic input and output in C language ,我们使用 printf()scanf() 函数。 printf() 函数用于在控制台上打印格式化文本。

printf("Hello world");

scanf() 函数用于接收用户的输入。

scanf("%d", &x); // Integer input
scanf("%f", &y); // float input
scanf("%c", &z); // Character Input
scanf("%s", name); // String input

= 基本输入和输出示例[id="_example_of_basic_input_and_output"]==== 基本输入和输出示例

#include <stdio.h>

int main() {
   int num;

   printf("Input any integer number: ");
   scanf("%d", &num);

   printf("The input is: %d\n", num);

   return 0;
}
Input any integer number: The input is: 0

= 标识符[id="_identifiers"]=== 标识符 C identifiers 是变量、常量、函数等的用户定义名称。以下是定义标识符的规则:

  1. 关键字不能用作标识符。

  2. 标识符中只允许字母、下划线符号 ( _ ) 和数字。

  3. 标识符必须以字母或下划线开头。

  4. 相同标识符不能用作两个实体的名称。

  5. 标识符应有意义且具有描述性。

示例——有效标识符[id="_examples_of_valid_identifiers"]==== 示例——有效标识符

age, _name, person1, roll_no

关键字[id="_keywords"]=== 关键字 C keywords 是 C 编译器中使用用于特定目的的反向字,不能用作标识符。 以下是 C 语言中的关键字:

auto

double

int

struct

break

else

long

switch

case

enum

register

typedef

char

extern

return

union

continue

for

signed

void

do

if

static

while

default

goto

sizeof

volatile

const

float

short

unsigned

变量[id="_variables"]=== 变量 C variables 是程序可用于访问和操作数据的存储区域的名称。 声明变量的语法[id="_syntax_of_declaring_a_variable"]==== 声明变量的语法

data_type variable_name;

转义序列[id="_escape_sequences"]=== 转义序列 Escape sequences 是以转义字符(反斜杠 \)为结尾的特殊字符。转义序列有特殊含义,用于打印无法正常打印的字符。 以下是 C 语言中的转义序列列表:

Escape sequence

Meaning

|\ character

\'

' character

\"

" character

\?

? character

\a

Alert or bell

\b

Backspace

\f

Form feed

\n

Newline

\r

Carriage return

\t

Horizontal tab

\v

Vertical tab

\ooo

一个到三个数字的八进制数

\xhh . . .

运算符[id="_operators"]=== 运算符 Operators 是用于执行特定数学或逻辑运算的特殊符号。 以下是 C 语言中使用的运算符:

Operators

Symbols

Description

Assignment Operators

=, +=, -=, <⇐

执行赋值运算,即向变量赋值。

Arithmetic Operators

+, -, *, /, %

Performs arithmetic operations.

Relational Operators

<, >, ⇐, >=, ==, !=

对两个操作数执行比较。

Logical Operators

&&,

, !

执行逻辑运算,例如逻辑 AND、OR 和 NOT。

Bitwise Operators

&, ^,

, <<, >>, ~

Performs bitwise operations.

Ternary Operator

? :

执行条件操作来进行决策。

Miscellaneous Operators

, sizeof, &, *, ⇒, .

用于执行其他各种操作。

= 运算符示例[id="_example_of_operators"]==== 运算符示例

result = num1 + num2;
if(result >=10){
   printf("Greater than 10.");
}

= 条件语句[id="_conditional_statements"]=== 条件语句 C 语言提供了以下条件语句−

  1. if Statement

  2. if-else Statement

  3. if-else-if Statement

  4. Nested if-else Statement

  5. Switch Statement

  6. Ternary Operator

= if 语句[id="_if_statement"]==== if 语句 if statement 由一个布尔表达式后跟一个或多个语句组成。 if 语句的语法为 −

if(boolean_expression) {
   /* statement(s) will execute if the boolean expression is true */
}

= if-else 语句[id="_if_else_statement"]==== if-else 语句 if-else statement 后跟一个可选的 else 语句,当布尔表达式为 false 时执行该语句。 if 语句的语法为 −

if (Boolean expr){
   Expression;
   . . .
}
else{
   Expression;
   . . .
}

= if-else-if 语句[id="_if_else_if_statement"]==== if-else-if 语句 if-else-if 语句也称为 ladder if-else。它用于在条件不成立时检查多个条件。 if-else-if 语句的语法 −

if(condition1){
}
else if(condition2){
}
…
else{
}

= 嵌套 if 语句[id="_nested_if_statements"]==== 嵌套 if 语句 使用 nested if statements ,可在另一个 if 或 else-if 语句中使用一个 if 或 else-if 语句。 嵌套 if 语句的语法 −

if (expr1){
   if (expr2){
      block to be executed when
      expr1 and expr2 are true
   }
   else{
      block to be executed when
      expr1 is true but expr2 is false
   }
}

= Switch 语句[id="_switch_statement"]==== Switch 语句 switch statement 允许将一个变量与值列表进行相等性测试。 switch 语句的语法 −

switch (Expression){

   // if expr equals Value1
   case Value1:
      Statement1;
      Statement2;
      break;

   // if expr equals Value2
   case Value2:
      Statement1;
      Statement2;
      break;
      .
      .
   // if expr is other than the specific values above
   default:
      Statement1;
      Statement2;
}

= 三元运算符[id="_ternary_operator"]==== 三元运算符 ternary operator (?:) 也被称为条件运算符。可用作 if-else 语句的替换。 三元运算符的语法 −

(condition) ? true_block: false_block;

= 循环[id="_loops"]=== 循环 C loops 用于分别执行一个或多个语句块指定的次数或者直到满足某个条件为止。以下是 C 语言中的循环语句 −

  1. while Loop

  2. do…​while Loop

  3. for Loop

= while 循环[id="_while_loop"]==== while 循环 while loop 是一个入口控制循环,在执行循环主体之前检查条件。 while 循环的语法 −

while(test_condition){
   // Statement(s);
}

= do…while 循环[id="_dowhile_loop"]==== do…while 循环 do…while 循环是一个出口控制循环,在这种循环中,循环体在检查条件之前执行。 do…while 循环的语法 −

do{
   // Statement(s);
}while(test_condition);

= for 循环[id="_for_loop"]==== for 循环 for 循环也是一个入口控制循环,其中,元素(初始化、测试条件和增量)被组合在一起,以在有 for 关键字的括号内形成一个 for 循环。 for 循环的语法 −

for(initialization ; test condition ; increment){
   // Statement (s);
}

= 跳转语句 [id="_jump_statements"] === 跳转语句 跳转语句用于将程序流程从一处传输到另一处。以下是C语言中的跳转语句 -

  1. goto Statement

  2. break Statement

  3. continue Statement

= goto 语句 [id="_goto_statement"] ==== goto 语句 goto statement 将程序的控制权传输到特定的标签。你需定义一个标签,后跟冒号 (:)。goto 语句可以向上或向下传输程序的流程。 goto 语句的语法是 - label_name:

//Statement(s)
if(test_condition){
   goto label_name;
}

= break 语句 [id="_break_statement"] ==== break 语句 break statement 可用于循环和 switch 语句。break 语句终止循环执行,并将程序的控制权传输到循环体外部。 break 语句的语法是 -

while(condition1){
   . . .
   . . .
   if(condition2)
   break;
      . . .
      . . .
}

= continue 语句 [id="_continue_statement"] ==== continue 语句 continue statement 用于跳过在当前迭代中循环内其余语句的执行,并将其传至下一循环迭代。 continue 语句的句法是 -

while (expr){
   . . .
   . . .
   if (condition)
      continue;
   . . .
}

= 用户定义函数 [id="_user_defined_functions"] === 用户定义函数 user-defined function 由用户定义,以执行特定任务以实现代码可重用性和模块化。 = 用户定义函数示例 [id="_example_of_user_defined_function"] ==== 用户定义函数示例

#include <stdio.h>

// Function declaration
int add(int, int);

// Function definition
int add(int a, int b) { return (a + b); }

int main() {
   int num1 = 10, num2 = 10;
   int res_add;

   // Calling the function
   res_add = add(num1, num2);

   // Printing the results
   printf("Addition is : %d\n", res_add);

   return 0;
}
Addition is : 20

= 数组 [id="_arrays"] === 数组 数组是存储在连续内存位置中、具有相似数据类型的的数据项集合。数据项可以是原数据类型(int、float、char),或用户定义类型,例如结构或指针可以存储在数组中。 C Arrays 可以分为两种类型 -

  1. One-dimensional (1D) Array - 一维数组是同一数据类型的单一数据项列表。

  2. * Multi-dimensional Arrays* - 多维数组(例如二维数组)就是数组的数组。

= 数组语法 [id="_syntax_of_arrays"]==== 数组语法 下面是不同类型的数组声明的语法 -

type array_name [size1];   // One-dimensional array
type array_name [size1][size2];   // Two-dimensional arrays
type array_name [size1][size2][size3];    // Three-dimensional arrays

= 一维数组示例 [id="_example_of_one_dimensional_array"]==== 一维数组示例

#include <stdio.h>

int main(){
   int numbers[5] = {10, 20, 30, 40, 50};

   int i;  // loop counter

   // Printing array elements
   printf("The array elements are : ");
   for (i = 0; i < 5; i++) {
      printf("%d ", numbers[i]);
   }

   return 0;
}
The array elements are : 10 20 30 40 50

= 二维数组示例 [id="_example_of_two_dimensional_arrays"]==== 二维数组示例

#include <stdio.h>

int main () {

   /* an array with 5 rows and 2 columns*/
   int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
   int i, j;

   /* output each array element's value */
   for ( i = 0; i < 5; i++ ) {
      for ( j = 0; j < 2; j++ ) {
         printf("a[%d][%d] = %d\n", i,j, a[i][j] );
      }
   }

   return 0;
}
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8

= 字符串 [id="_strings"]=== 字符串 C string 是一个字符序列,即 char 数据类型的数组,它以用 '\0' 表示的“空字符”结尾。要使用 scanf() 和 printf() 函数来读取和打印字符串,您需要使用 "%s" 格式说明符。 String Declaration

char string_name[size];

Reading String

scanf("%s", string_name);

Printing String

printf("%s", string_name);

= C 字符串示例 [id="_example_of_c_strings"]==== C 字符串示例

#include <stdio.h>

int main() {
   char name[20];

   printf("Enter a name: ");
   scanf("%s", name);

   printf("You entered: %s", name);

   return 0;
}

= 字符串函数 [id="_strings_functions"]==== 字符串函数 C 标准库 string.h 提供了各种函数来处理字符串。下面是 C 字符串函数列表 -

Sr.No.

Function

Description

1

char *strcat

将 src 指向的字符串追加到 dest 指向的字符串末尾。

2

char *strncat

将 src 指向的字符串追加到 dest 指向的字符串末尾,追加长度最长为 n 个字符。

3

char *strchr(

在 str 参数指向的字符串中,搜索字符 c(无符号 char)的第一次出现。

4

int strcmp

将 str1 指向的字符串与 str2 指向的字符串进行比较。

5

int strncmp

将 str1 和 str2 的前 n 个字节进行比较。

6

int strcoll

将字符串 str1 与 str2 进行比较。结果取决于位置的 LC_COLLATE 设置。

7

char *strcpy

将由 src 指向的字符串复制到 dest 中。

8

char *strncpy

最多从由 src 指向的字符串中复制 n 个字符到 dest 中。

9

size_t strcspn

计算 str1 中完全包含不在 str2 中的字符的初始段的长度。

10

char *strerror

在内部数组中搜索错误编号 errnum,并返回错误消息字符串的指针。

11

size_t strlen

计算字符串 str 的长度,直到但不包括终止 null 字符。

12

char *strpbrk

在字符串 str1 中查找第一个与 str2 中指定字符匹配的字符。

13

char *strrchr

在由参数 str 指向的字符串中搜索字符 c(一个无符号 char)的最后出现。

14

size_t strspn

计算 str1 中完全包含 str2 中字符的初始段的长度。

15

char *strstr

在字符串 haystack 中找到整个字符串 needle(不包括终止 null 字符)的第一个出现。

16

char *strtok

将字符串 str 分解为一系列由 delim 分隔的标记。

17

size_t strxfrm

把字符串 src 的前 n 个字符转换成当前语言区域并放在字符串 dest 中。

= 结构[id="_structures"]=== 结构 C structures 是不同类型的数据的集合。结构被认为是用户自定义的类型,您可以用它们来对不同类型的数据项进行分组。 = 结构声明语法[id="_structure_declaration_syntax"]==== 结构声明语法

struct struct_name {
   type1 item1;
   type2 item2;
   .
   .
}structure_variable;

= 结构示例[id="_example_of_structure"]==== 结构示例

#include <stdio.h>

struct book{
   char title[10];
   char author[20];
   double price;
   int pages;
};

int main(){
   struct book book1 = {"Learn C", "Dennis Ritchie", 675.50, 325};

   printf("Title:  %s \n", book1.title);
   printf("Author: %s \n", book1.author);
   printf("Price:  %lf\n", book1.price);
   printf("Pages:  %d \n", book1.pages);
   printf("Size of book struct: %d", sizeof(struct book));
   return 0;
}
Title:  Learn C
Author: Dennis Ritchie
Price:  675.500000
Pages:  325
Size of book struct: 48

= 联合[id="_unions"]=== 联合 C union 是一个用户自定义的类型,允许在相同内存位置处存储不同类型的数据项集合。 = 联合声明语法[id="_syntax_of_union_declaration"]==== 联合声明语法

union [union tag]{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

= 联合示例[id="_example_of_union"]==== 联合示例

#include <stdio.h>

union Data{
   int i;
   float f;
};

int main(){
   union Data data;

   data.i = 10;
   data.f = 220.5;

   printf("data.i: %d \n", data.i);
   printf("data.f: %f \n", data.f);
   return 0;
}
data.i: 1130135552
data.f: 220.500000

= 枚举 (enum)[id="_enumerations_enums"]=== 枚举 (enum) C enumeration (enum) 是一个枚举数据类型,其包含一组整数常量。 = 枚举声明的语法[id="_syntax_of_enum_declaration"]==== 枚举声明的语法

enum myenum {val1, val2, val3, val4};

= 枚举 (enum) 示例[id="_example_of_enumeration_enum"]==== 枚举 (enum) 示例

#include <stdio.h>

enum status_codes { OKAY = 1, CANCEL = 0, ALERT = 2 };

int main() {
   // Printing values
   printf("OKAY = %d\n", OKAY);
   printf("CANCEL = %d\n", CANCEL);
   printf("ALERT = %d\n", ALERT);

   return 0;
}
OKAY = 1
CANCEL = 0
ALERT = 2

= 指针[id="_pointers"]=== 指针 C pointers 是派生数据类型,其用于存储另一个变量的地址,并且还可以用于通过该位置访问和控制存储有变量数据的内存。 = 指针声明的语法[id="_syntax_of_pointer_declaration"]==== 指针声明的语法

data_type *pointer_name;

= 指针初始化的语法[id="_syntax_of_pointer_initialization"]==== 指针初始化的语法 如果声明了一个指针,则可以使用以下语法来用另一个变量的地址初始化一个指针 −

pointer_name = &variable_name;

= 指针示例[id="_pointer_example"]==== 指针示例

#include <stdio.h>

int main() {
   int x = 10;

   // Pointer declaration and initialization
   int * ptr = & x;

   // Printing the current value
   printf("Value of x = %d\n", * ptr);

   // Changing the value
   * ptr = 20;

   // Printing the updated value
   printf("Value of x = %d\n", * ptr);

   return 0;
}
Value of x = 10
Value of x = 20

= 指针类型[id="_type_of_pointers"]==== 指针类型 C 语言中具有多种类型的指针。它们是 −

  1. Null pointer

  2. Wild pointer

  3. Void pointer

  4. Dangling pointer

  5. Complex pointers

  6. Far pointer

  7. File pointers

  8. Double pointers

  9. Near pointer

= 动态内存分配[id="_dynamic_memory_allocations"]=== 动态内存分配 变量的内存会在编译时进行声明。C 语言提供了一些函数用于动态内存分配,这些函数使得可以在运行时为变量分配内存。 动态内存分配的函数有 −

  1. malloc()

  2. calloc()

  3. realloc()

  4. free()

= malloc() 函数[id="_malloc_function"]==== malloc() 函数 malloc() function 分配请求的内存(指定大小的一定数量的块),并返回对其的指针。 malloc() 函数的语法为 −

malloc (size_t size);
calloc() Function

= calloc() 函数[id="_calloc_function"]==== calloc() 函数 calloc() function 分配所请求的内存(指定大小的区块数),并返回 void 指针。calloc() 函数将分配的内存设置为零。 calloc() 函数的语法为:-

void *calloc(size_t nitems, size_t size)

= realloc() 函数[id="_realloc_function"]==== realloc() 函数 realloc() function 尝试调整以前通过调用 malloc() 或 calloc() 函数分配的指针指向的内存区块的大小。 realloc() 函数的语法为:-

void *calloc(size_t nitems, size_t size)

= free() 函数[id="_free_function"]==== free() 函数 free() function 释放以前通过调用 calloc()、malloc() 或 realloc() 分配的内存。 realloc() 函数的语法为:-

void *calloc(size_t nitems, size_t size)

= 文件处理[id="_file_handling"]==== 文件处理 File handling 指执行文件上的各种操作,例如创建、写入、读取、删除、移动、重命名文件等。C 语言提供各种文件处理函数。 = 文件操作[id="_file_operations"]==== 文件操作 以下是使用 C 语言文件处理函数可执行的文件操作:

  1. Creating a new file

  2. Opening an existing file

  3. 将数据写入文件

  4. 将数据追加到文件

  5. 从文件读取数据

  6. Renaming a file

  7. Deleting a file

  8. Closing a file

= 文件处理函数[id="_file_handling_functions"]==== 文件处理函数 以下是在 C 中列出的文件处理函数:-

Function

Description

fopen()

以各种模式创建和打开文件。

fclose()

Closes a file.

fputc(), fputs(), fprintf()

将数据写入文件。

fgetc(), fgets(), fscanf()

从文件读取数据。

fwrite(), fread()

将数据写入或从二进制文件读取数据。

rename()

Renames a file.

remove()

Deleted a file.

= 文件处理示例[id="_example_of_file_handling"]==== 文件处理示例 以下为 C 语言中文件处理的示例 -

#include <stdio.h>
#include <stdlib.h>

int main() {
   FILE *file;
   char file_name[] = "my_file.txt";
   char write_data[100] = "Tutorials Point";
   char read_data[100];

   // Opening file in write mode
   file = fopen("file_name.txt", "w");
   if (file == NULL) {
      printf("Error\n");
      return 1;
   }
   // Writing to the file
   fprintf(file, "%s", write_data);
   // Closing the file
   fclose(file);

   // Again, opening the file in read mode
   file = fopen("file_name.txt", "r");
   if (file == NULL) {
      printf("Error.\n");
      return 1;
   }

   // Reading data from the file
   if (fgets(read_data, 100, file) != NULL) {
      // Printing it on the screen
      printf("File's data:\n%s\n", read_data);
   }
   fclose(file);

   return 0;
}
File's data:
Tutorials Point

= 预处理指令[id="_preprocessor_directives"]=== 预处理指令 preprocessor directives 是预编译的一部分,并以井号 (#) 字符开头。这些指令指示编译器在开始编译过程之前展开 include 并展开代码。 以下是预处理指令列表 -

Directive

Description

# define

Substitutes a preprocessor macro.

#include

从另一个文件中插入一个特定头。

#undef

Undefines a preprocessor macro.

#ifdef

如果定义了此宏,则返回 true。

#ifndef

如果未定义此宏,则返回 true。

#if

测试编译时条件是否为真。

#else

The alternative for #if.

#elif

在一个语句中使用 #else 和 #if。

#endif

Ends preprocessor conditional.

#error

在 stderr 上打印错误消息。

#pragma

使用标准化方法向编译器发出特殊命令。

= 预处理指令示例[id="_example_of_preprocessor_directive"]==== 预处理指令示例 这是 #define 的示例,它是 C 语言中预处理器指令之一 -

#define MAX_ARRAY_LENGTH 20

= 标准库 [id="_standard_libraries"]=== 标准库 以下是常用库(C 头文件)的列表 -

Header file

Usage

stdio.h

提供标准输入和输出函数。

string.h

提供各种字符串操作的函数。

math.h

提供用于数学运算的功能。

stdlib.h

提供各种用于内存分配、类型转换等的实用程序功能。

time.h

Provides date-time related functions.