C-技巧积累

字符串转 integer

stdlib.h 标准库中的 atoi 函数:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main() {
const char *str = "12345";
int num = atoi(str);
printf("The integer is: %d\n", num);
return 0;
}

使用 int8_t 等类型

需要导入 stdint.h 头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define FREQ_OFFSET 7
#define FREQ_LEN 4

int main() {
int8_t rx_data[11] = "-DELAY 1000";
int8_t freq[FREQ_LEN + 1]; // 确保有足够的空间来存储字符和空字符 '\0'

strncpy((char*)freq, (char*)(rx_data + FREQ_OFFSET), FREQ_LEN);
freq[FREQ_LEN] = '\0'; // 添加空字符以确保字符串正确终止

// 将 freq 转换为 int 类型以打印,因为 %d 需要 int 类型的参数
printf("%s", freq);

return 0;
}

拆分字符串到一个数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdint.h>

int main() {
// 原始的 uint8_t 数组,包含字符串 "12 30 40"
uint8_t input[] = "12 30 40";

// 用于存储拆分后的数字
int numbers[3];

// 使用 sscanf 将字符串拆分并存入 numbers 数组
sscanf((char *)input, "%d %d %d", &numbers[0], &numbers[1], &numbers[2]);

// 打印输出验证
printf("拆分后的数字是: %d, %d, %d\n", numbers[0], numbers[1], numbers[2]);

return 0;
}

目标文件中使用的地址

目标文件在链接之前, 其使用的地址都是相对地址 (或未重定向的地址):

  • 起始位置为 0 开始 (真实地址是链接后加上一个地址)

这些相对地址记录在目标文件的符号表中.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

void foo() {
printf("In foo\n");
}

void bar() {
printf("In bar\n");
}

int main() {
foo();
bar();
return 0;
}

假设目标文件中的地址为:

函数名 相对地址
foo 0
bar 16
main 32

(这里函数的长度先不管)

则链接后, 连接器会将其转换为绝对地址, 加入是被加载到内存中的 0x1000 处, 则为:

函数名 链接后的地址
foo 0x1000
bar 0x1000 + 16
main 0x1000 + 32

一般在调用时会动态链接, 此时才会决定在内存中的位置.

main 函数是否有函数声明

因为 main 是程序的入口点, 编译器会自动识别其定义而不需要额外的函数声明.

函数声明的简写

在函数声明中, 函数的参数名一般不太重要, 直接写类型即可, 如:

1
void process_data(int, int);

变长数组

也就是说数组的长度可以由一个变量值来确定了. 如:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void) {
int n = 10;
int arr[n];
printf("%ld", sizeof(arr)/sizeof(arr[0]));
}

生成随机数

若不设置种子, rand() 只是伪随机数 (即每次运行返回的都一样).

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
// 设置随机数种子
srand((unsigned)time(NULL));

// 生成并打印 10 个随机数
for (int i = 0; i < 10; i++) {
int random_number = rand(); // 生成随机数
printf("随机数 %d: %d\n", i + 1, random_number);
}

return 0;
}
  • srand((unsigned)time(NULL)), 这里的 (unsigned) 是强制类型转换, time(NULL) 获取当前时间

定义和使用二进制数

0b 前缀. 如:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void) {
int bin = 0b10011;
int result = 0b10011 & 0b11111;
printf("Result: %d", result);
}

C-技巧积累
http://example.com/2024/09/25/C-技巧积累/
作者
Jie
发布于
2024年9月25日
许可协议