常用知识点总结
目录
常见库函数
字符处理函数(在 <ctype.h>
头文件中)
isalpha(int ch)
: 检查字符是否是字母。
isdigit(int ch)
: 检查字符是否是数字。
isalnum(int ch)
: 检查字符是否是字母或数字。
islower(int ch)
: 检查字符是否是小写字母。
isupper(int ch)
: 检查字符是否是大写字母。
tolower(int ch)
: 将字符转换为小写形式。
toupper(int ch)
: 将字符转换为大写形式。
字符串处理函数(在 <string.h>
头文件中)
strlen(const char *str)
: 返回字符串的长度。
strcpy(char *dest, const char *src)
: 将一个字符串复制到另一个字符串。
strcat(char *dest, const char *src)
: 将一个字符串追加到另一个字符串。
strcmp(const char *str1, const char *str2)
: 比较两个字符串。
strncmp(const char *str1, const char *str2, size_t n)
: 比较两个字符串的前 n 个字符。
strchr(const char *str, int ch)
: 在字符串中查找字符第一次出现的位置。
strstr(const char *haystack, const char *needle)
: 在字符串中查找子字符串的第一次出现位置。
数学函数(在 <math.h>
头文件中)
sqrt(double x)
: 返回 x 的平方根。
pow(double x, double y)
: 返回 x 的 y 次幂。
fabs(double x)
: 返回 x 的绝对值。
ceil(double x)
: 返回不小于 x 的最小整数值。
floor(double x)
: 返回不大于 x 的最大整数值。
sin(double x)
: 返回 x 的正弦值。
cos(double x)
: 返回 x 的余弦值。
tan(double x)
: 返回 x 的正切值。
输入/输出函数(在 <stdio.h>
头文件中)
printf(const char *format, ...)
: 格式化输出到标准输出。
scanf(const char *format, ...)
: 格式化输入从标准输入。
fgets(char *str, int n, FILE *stream)
: 从文件流中读取一行。
fputs(const char *str, FILE *stream)
: 将字符串写入文件流。
fscanf(FILE *stream, const char *format, ...)
: 从文件流中格式化输入。
fprintf(FILE *stream, const char *format, ...)
: 将格式化输出写入文件流。
内存分配函数(在 <stdlib.h>
头文件中)
qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
: 对数组进行快速排序。
malloc(size_t size)
: 分配指定字节数的内存。
calloc(size_t num, size_t size)
: 分配指定数量和大小的内存块,并将其初始化为零。
realloc(void *ptr, size_t size)
: 更改之前分配的内存块的大小。
free(void *ptr)
: 释放之前分配的内存块。
这只是一小部分标准库函数。C 语言标准库提供了许多其他有用的函数,用于处理日期和时间、动态分配内存等。标准库函数的完整列表和详细信息可以在相关的 C 语言标准文档中找到。
switch用法 1 2 3 4 5 6 7 8 9 10 11 switch (m){ case 1 : case 3 : case 5 : printf ("yes" ); break ; case 4 :case 6 : printf ("no" ); break ; default : break ; }
输入数值后输入字符串
1 2 scanf ("%d\n" ,&n);gets(text);
fgets用法
结束使用NULL而非EOF(当 fgets 遇到文件结束时,它会返回一个空指针 (NULL))
strcspn 函数返回字符串中不包含指定字符集合中任何字符的第一个位置(即字符串中不包含这些字符的部分的长度)
用scanf读取字符串时,%s在遇到空格、制表符或换行符时会停止读取。如果用户输入包含空格,只会读取第一个单词1 2 3 4 5 6 7 fgets(myString, sizeof (myString), stdin ); myString[strcspn (myString, "\n" )] = '\0' ; printf ("Processed string: %s\n" , myString);
strstr用法 需要注意的是,strstr 是区分大小写的。如果你需要进行大小写不敏感的查找,可以考虑使用其他函数,比如 strcasestr(不是标准C函数,但在一些系统中可能提供)或手动转换字符串为小写/大写后再使用 strstr。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <string.h> int main () { const char *haystack = "Hello, World!" ; const char *needle = "World" ; char *result = strstr (haystack, needle); if (result != NULL ) { printf ("'%s' found at position %ld in '%s'\n" , needle, result - haystack, haystack); } else { printf ("'%s' not found in '%s'\n" , needle, haystack); } return 0 ; }
strcmp用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> #include <string.h> int main () { const char *str1 = "apple" ; const char *str2 = "banana" ; int result = strcmp (str1, str2); if (result < 0 ) { printf ("%s is less than %s\n" , str1, str2); } else if (result == 0 ) { printf ("%s is equal to %s\n" , str1, str2); } else { printf ("%s is greater than %s\n" , str1, str2); } return 0 ; }
判断字母大小写 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <ctype.h> int main () { char ch = 'A' ; if (isupper (ch)) { printf ("%c is an uppercase letter.\n" , ch); } else { printf ("%c is not an uppercase letter.\n" , ch); } return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <ctype.h> int main () { char ch = 'a' ; if (islower (ch)) { printf ("%c is a lowercase letter.\n" , ch); } else { printf ("%c is not a lowercase letter.\n" , ch); } return 0 ; }
sscan & sprintf用法 sscanf:用于从字符串中按照指定的格式读取数据。
函数原型:int sscanf(const char *str, const char *format, ...);
参数:
str:要读取的字符串。
format:格式说明符,指定了要读取的数据的类型和格式。
后续的参数:指向变量的指针,用于存储读取到的数据。
返回值:成功读取并赋值的参数个数。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <stdio.h> int main () { char input[] = "John 25 1.75" ; char name[20 ]; int age; float height; int result = sscanf (input, "%s %d %f" , name, &age, &height); if (result == 3 ) { printf ("Name: %s\n" , name); printf ("Age: %d\n" , age); printf ("Height: %.2f\n" , height); } else { printf ("Failed to read data from the string.\n" ); } return 0 ; }
sprintf:用于按照指定的格式将数据写入字符串。
函数原型:int sprintf(char *str, const char *format, ...);
参数:
str:目标字符串,用于存储格式化后的数据。
format:格式说明符,指定了要写入的数据的类型和格式。
后续的参数:要写入的数据。
返回值:写入到字符串中的字符数(不包括终止符 \0)。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { char buffer[50 ]; int num = 42 ; float pi = 3.14159 ; int result = sprintf (buffer, "The number is %d and the value of pi is %.2f" , num, pi); if (result > 0 ) { printf ("Formatted string: %s\n" , buffer); } else { printf ("Error in sprintf function.\n" ); } return 0 ; }
取两个数中较大值或较小值 1 2 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
qsort用法 这个函数接受四个参数:
base:指向待排序数组的指针。
nmemb:数组中元素的个数。
size:每个元素的大小(以字节为单位)。
compar:比较函数的指针,用于定义元素之间的比较规则。
比较函数 compar 应该返回一个整数:
如果第一个参数小于第二个参数,返回负数。
如果第一个参数等于第二个参数,返回零。
如果第一个参数大于第二个参数,返回正数。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> #include <stdlib.h> int compareIntegers (const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main () { int numbers[] = {5 , 2 , 9 , 1 , 5 , 6 }; size_t size = sizeof (numbers) / sizeof (numbers[0 ]); qsort(numbers, size, sizeof (numbers[0 ]), compareIntegers); for (size_t i = 0 ; i < size; ++i) { printf ("%d " , numbers[i]); } printf ("\n" ); return 0 ; }
判断一个十进制数的二进制表示中有几个“ 1 ” 1 2 3 4 5 6 7 8 9 10 11 12 13 int countOnesInBinary (int num) { int count = 0 ; while (num != 0 ) { if (num % 2 == 1 ) { count++; } num /= 2 ; } return count; }
找最大公约数 1 2 3 4 5 6 7 8 int findGCD (int a, int b) { while (b != 0 ) { int temp = b; b = a % b; a = temp; } return a; }
二分法查找数组中目标数值的位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #include <stdio.h> int binarySearch (int arr[], int low, int high, int target) ;int main () { int size; printf ("Enter the size of the sorted array: " ); scanf ("%d" , &size); int arr[size]; printf ("Enter the sorted array elements:\n" ); for (int i = 0 ; i < size; i++) { scanf ("%d" , &arr[i]); } int target; printf ("Enter the target value to search: " ); scanf ("%d" , &target); int result = binarySearch(arr, 0 , size - 1 , target); if (result != -1 ) { printf ("Target value %d found at index %d.\n" , target, result); } else { printf ("Target value %d not found in the array.\n" , target); } return 0 ; } int binarySearch (int arr[], int low, int high, int target) { while (low <= high) { int mid = low + (high - low) / 2 ; if (arr[mid] == target) { return mid; } if (arr[mid] > target) { high = mid - 1 ; } else { low = mid + 1 ; } } return -1 ; }
位运算 1. 按位与(AND):&
将两个操作数的对应位进行与操作,结果位为1当且仅当两个操作数对应位都为1。
2. 按位或(OR):|
将两个操作数的对应位进行或操作,结果位为1当且仅当两个操作数对应位至少有一个为1。
3. 按位异或(XOR):^
将两个操作数的对应位进行异或操作,结果位为1当且仅当两个操作数对应位不相等。
4. 按位取反(NOT):~
5. 左移:<<
6. 右移:>>
将操作数的所有位向右移动指定的位数,左侧补符号位(对于有符号整数)或者补零(对于无符号整数)。
占位符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <stdio.h> int main () { int integerVar = 42 ; float floatVar = 3.14 ; char charVar = 'A' ; char stringVar[] = "Hello, World!" ; int *pointerVar = &integerVar; printf ("Integer: %d\n" , integerVar); printf ("Float: %f\n" , floatVar); printf ("Char: %c\n" , charVar); printf ("String: %s\n" , stringVar); printf ("Pointer: %p\n" , pointerVar); printf ("Integer in Hexadecimal: %x\n" , integerVar); return 0 ; }
数据类型及范围 整型数据类型
int
: 整数类型,通常占用4个字节,表示整数值。范围约为 -2,147,483,648
到 2,147,483,647
。
char
: 字符类型,占用1个字节,表示单个字符的ASCII码值。范围为 0
到 255
或 -128
到 127
(有符号/无符号)。
short
: 短整数类型,通常占用2个字节,表示较小范围的整数值。范围约为 -32,768
到 32,767
。
long
: 长整数类型,占用4或8个字节,表示较大范围的整数值。范围约为 -2,147,483,648
到 2,147,483,647
(32位系统)或 -9,223,372,036,854,775,808
到 9,223,372,036,854,775,807
(64位系统)。
long long
: 更长的整数类型,占用8个字节,表示更大范围的整数值。范围约为 -9,223,372,036,854,775,808
到 9,223,372,036,854,775,807
。
浮点型数据类型
float
: 单精度浮点数类型,通常占用4个字节,表示小数值。范围约为 1.17549435e-38
到 3.40282347e+38
。
double
: 双精度浮点数类型,通常占用8个字节,表示更高精度的小数值。范围约为 2.2250738585072014e-308
到 1.7976931348623158e+308
。
字符型数据类型
char
: 字符类型,占用1个字节,表示单个字符的ASCII码值。范围为 0
到 255
或 -128
到 127
(有符号/无符号)。
指针类型
int*
: 指向整数的指针类型。
float*
: 指向浮点数的指针类型。
char*
: 指向字符的指针类型。
数组类型
int[]
: 整数数组类型。
float[]
: 浮点数数组类型。
char[]
: 字符数组类型。
其他类型
void
: 表示没有数据类型。
enum
: 枚举类型,用于定义一组命名的整数常量。
这些数据类型和范围的信息对于正确使用和存储数据至关重要。请注意,数据范围可能会因编译器和操作系统的不同而有所不同。
转义符 在C语言中,转义符(Escape Characters)以反斜杠(\
)开头,用于在字符串常量中表示一些特殊字符或控制字符。以下是一些常见的C语言转义符:
\\n
: 换行符(New Line)
示例:printf("Hello\\nWorld");
\\t
: 水平制表符(Tab)
示例:printf("Name:\\tJohn");
\\r
: 回车符(Carriage Return)
\\b
: 退格符(Backspace)
示例:printf("Back\\bSpace");
\\f
: 换页符(Form Feed)
示例:printf("Page 1\\fPage 2");
\\\\
: 反斜杠自身
示例:printf("This is a backslash: \\\\\\");
\\\"
: 双引号自身
示例:printf("He said, \\"Hello!\\"");
\\\'
: 单引号自身
\\0
: 空字符(Null)
示例:字符串结尾的空字符 '\\0'
是C语言字符串的终止符。
\0
到 \7
: 八进制转义字符
示例:printf("Octal representation: \\115");(表示 'M')
\x0
到 \xFF
: 十六进制转义字符
示例:printf("Hex representation: \\x4A");(表示 'J')
递归函数计算阶乘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> unsigned long long factorial (int n) { if (n == 0 || n == 1 ) { return 1 ; } else { return n * factorial(n - 1 ); } } int main () { int num = 5 ; unsigned long long result = factorial(num); printf ("Factorial of %d = %llu\n" , num, result); return 0 ; }
判断质数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include <stdio.h> int isPrime (int number) { if (number <= 1 ) { return 0 ; } for (int i = 2 ; i * i <= number; ++i) { if (number % i == 0 ) { return 0 ; } } return 1 ; } int main () { int num; printf ("Enter a positive integer: " ); scanf ("%d" , &num); if (isPrime(num)) { printf ("%d is a prime number.\n" , num); } else { printf ("%d is not a prime number.\n" , num); } return 0 ; }
冒泡排序 升序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <stdio.h> void bubbleSortAsc (int arr[], int n) { for (int i = 0 ; i < n - 1 ; ++i) { for (int j = 0 ; j < n - i - 1 ; ++j) { if (arr[j] > arr[j + 1 ]) { int temp = arr[j]; arr[j] = arr[j + 1 ]; arr[j + 1 ] = temp; } } } } void printArray (int arr[], int size) { for (int i = 0 ; i < size; ++i) { printf ("%d " , arr[i]); } printf ("\n" ); } int main () { int arr[] = {64 , 34 , 25 , 12 , 22 , 11 , 90 }; int n = sizeof (arr) / sizeof (arr[0 ]); printf ("Unsorted array: " ); printArray(arr, n); bubbleSortAsc(arr, n); printf ("Sorted array (ascending): " ); printArray(arr, n); return 0 ; }
降序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <stdio.h> void bubbleSortDesc (int arr[], int n) { for (int i = 0 ; i < n - 1 ; ++i) { for (int j = 0 ; j < n - i - 1 ; ++j) { if (arr[j] < arr[j + 1 ]) { int temp = arr[j]; arr[j] = arr[j + 1 ]; arr[j + 1 ] = temp; } } } } void printArray (int arr[], int size) { for (int i = 0 ; i < size; ++i) { printf ("%d " , arr[i]); } printf ("\n" ); } int main () { int arr[] = {64 , 34 , 25 , 12 , 22 , 11 , 90 }; int n = sizeof (arr) / sizeof (arr[0 ]); printf ("Unsorted array: " ); printArray(arr, n); bubbleSortDesc(arr, n); printf ("Sorted array (descending): " ); printArray(arr, n); return 0 ; }
大小写转换函数(toupper & tolower) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <ctype.h> int main () { char ch = 'A' ; char lowercaseCh = tolower (ch); printf ("Original character: %c\n" , ch); printf ("Lowercase character: %c\n" , lowercaseCh); return 0 ; }