跳转至

4.2 字符数组与字符串

单片机里你要做的事情之一就是:通过串口发一段文字、在 OLED 上显示一句话。这些"文字"在 C 语言里就是字符数组。

// 字符串本质就是一个 char 数组,末尾有个隐藏的 \0(空字符)
char name[] = "STM32";    // 等价于:char name[6] = {'S','T','M','3','2','\0'};

// 长度是 5 个字符 + 1 个 \0 = 6 个字节
printf("%s\n", name);      // %s 打印字符串,碰到 \0 就停

在内存里的样子:

┌────┬────┬────┬────┬────┬────┐
│ S  │ T  │ M  │ 3  │ 2  │ \0 │
└────┴────┴────┴────┴────┴────┘
  0    1    2    3    4    5    ← \0 是结束标记,不是可显示字符

重点: - "hello" 在内存里实际是 {'h','e','l','l','o','\0'}多了一个隐藏的 \0 - \0 (空字符) 的值就是 0,用来标记字符串的结束 - printf("%s", str) 从第一个字符开始打印,遇到 \0 就停 - 声明字符数组时要留够 \0 的位置

char msg[10] = "OK";     // 没问题,OK + \0 只占3个字节
char msg2[3] = "OK";     // 也OK,刚好够放 O + K + \0
char msg3[2] = "OK";     // ❌ 错误!没地方放 \0,这样会出大问题

👉 到单片机上有什么用?

// 串口发送一条消息(UART 是单片机最常用的通信方式)
char message[] = "LED已点亮\r\n";   // \r\n 是换行,串口终端需要这个
HAL_UART_Transmit(&huart1, (uint8_t*)message, sizeof(message) - 1, 100);
// 注意:sizeof(message) 会把 \0 也算进去,所以减1去掉它