常用操作汇总(C)
字符串
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.h>
islower(), 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!=0
GCC/Clang 的内置函数,统计前导零的个数(Count Leading Zeros)
sprintf() // 将格式化的数据写入字符串(内存)
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") --> 100
strcat // 合并
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);
strcmp
strncmp // 前n个字符比较
int strncmp(const char *s1, const char *s2, size_t n);
hash
【define】
#include "uthash.h" // 单头文件库
struct my_struct {
int id; // key
char name[20]; // value
UT_hash_handle hh; // 必须包含这个成员
} hashname;
【op】
HASH_FIND
HASH_ADD
HASH_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] = 3
for(int i = 0; i<r; i++){
ans[i] = malloc(sizeof(int)*c);
for(int j = 0; j<c; j++){
// set --> ans[i][j] = matrix[i*c+j];
}
(*returnColumnSizes)[i] = c;
}
*returnSize = r;
return ans;
内存
memcpy
void *memcpy(void *dest, const void *src, size_t n);
memset
memset(arr, -1, sizeof(int)*n); // malloc
memset(arr, -1, sizeof(arr)); // int arr[n]
注意:memset针对字节,在c语言中如果想将数组全赋值为inf需要用for循环
int只能全部初始化为0,-1,或char类型
如果初始化为1会因为每次取一字节导致初始化每个int元素为0x01010101
malloc
calloc // malloc + 初始化
realloc // 更改原arr
更多推荐


所有评论(0)