字符串strlen()strtok(字符串 , 分隔符)//将字符串按分隔符切分会修改原字符串char *strtok(char *str, const char *delimiters);// 第一次传入要分割的字符串// 后续传入 NULL 继续分割char str[] apple banana orange; char *token; // 第一次调用传入要分割的字符串 token strtok(str, ); printf(%s\n, token); // apple // 后续调用传入 NULL 继续分割 while ((token strtok(NULL, )) ! NULL) { printf(%s\n, token); }ctype.hislower(), tolower()isupper(), toupper()isalnum()// 判断是否是数字或字母isalpha()isdigit()//内置函数__builtin_popcount(x)// 计算整数二进制表示中 1 的个数int __builtin_popcount(unsigned int x); // 32位整数int __builtin_popcountl(unsigned long x); // 长整数int __builtin_popcountll(unsigned long long x); // 长长整数__builtin_clz注意x!0GCC/Clang 的内置函数统计前导零的个数Count Leading Zerossprintf()//将格式化的数据写入字符串内存int sprintf(char *str, const char *format, ...);#include stdio.h int main() { char buffer[100]; int age 25; double height 1.75; // 将多个数据格式化到 buffer sprintf(buffer, 年龄: %d, 身高: %.2f 米, age, height); printf(%s\n, buffer); // 输出: 年龄: 25, 身高: 1.75 米 return 0; }strstr()char *strstr(const char *haystack, const char *needle);找到返回指向第一次出现位置的指针没找到返回 NULL#include stdio.h #include string.h int main() { char str[] Hello World, Hello C; char *p; p strstr(str, World); if (p ! NULL) { printf(找到位置: %s\n, p); // 输出: World, Hello C printf(偏移量: %ld\n, p - str); // 输出: 6 } p strstr(str, Java); if (p NULL) { printf(没找到\n); } return 0; }atoi()// 字符串转换成整数int atoi(const char* str);e.g. atoi(100) -- 100strcat//合并char* strcat(char* dest, const char* src);#include stdio.h #include string.h int main() { char dest[50] Hello; // 必须足够大 char src[] World!; strcat(dest, src); printf(%s\n, dest); // 输出: Hello World! return 0; }strcpy //将一个字符串复制到另一个字符串char *strcpy(char *dest, const char *src);strcmpstrncmp// 前n个字符比较int strncmp(const char *s1, const char *s2, size_t n);hash【define】#include uthash.h // 单头文件库struct my_struct {int id; // keychar name[20]; // valueUT_hash_handle hh;// 必须包含这个成员} hashname;【op】HASH_FINDHASH_ADDHASH_FREE快排qsort// 升序 int一维数组int cmp(const void* _a, const void* _b){return *(int*)_a - *(int*)_b;}qsort(arr, n, sizeof(int), cmp);// 二维数组以第一个元素为准升序int cmp(const void* a, const void* b) {return (*(int**)a)[0] - (*(int**)b)[0];}qsort(arr, n, sizeof(int*), cmp);// 结构体typedef struct {int val;// 其他成员} Node;int cmp(const void *a, const void *b) {Node *pa (Node*)a; // 先转成 Node*Node *pb (Node*)b;return pa-val - pb-val; // 升序}二维数组int** ans malloc(sizeof(int*)*r); // 二维数组有r行一维数组// [ [1,2,3], [1,2], [1] ]*returnColumnSizes malloc(sizeof(int) * r); // int** returnColumnSizes -- 每行有几列// [ [3,2,1] ] ### *returnColumnSizes --[3,2,1] ### (*returnColumnSizes)[0] 3for(int i 0; ir; i){ans[i] malloc(sizeof(int)*c);for(int j 0; jc; j){// set -- ans[i][j] matrix[i*cj];}(*returnColumnSizes)[i] c;}*returnSize r;return ans;内存memcpyvoid *memcpy(void *dest, const void *src, size_t n);memsetmemset(arr, -1, sizeof(int)*n); // mallocmemset(arr, -1, sizeof(arr)); // int arr[n]注意memset针对字节在c语言中如果想将数组全赋值为inf需要用for循环int只能全部初始化为0-1或char类型如果初始化为1会因为每次取一字节导致初始化每个int元素为0x01010101malloccalloc // malloc 初始化realloc // 更改原arr