字符串转 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];
strncpy((char*)freq, (char*)(rx_data + FREQ_OFFSET), FREQ_LEN); freq[FREQ_LEN] = '\0';
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 input[] = "12 30 40"; int numbers[3]; 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));
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); }
|