Day07_C语言字符串避坑指南

Day07_C语言字符串避坑指南
嵌入式自学 Day07我踩过的 6 个字符串坑——strlen、sizeof、\0、gets 全讲透这是我的嵌入式自学Day07。前几天一直在学数组我以为字符数组不过是「存字符的数组」。直到写出这样一段代码chars[10]hello;printf(%d\n,strlen(s));printf(%d\n,sizeof(s));我本来以为两个都会输出10。结果程序却打印5 10当时第一反应就是数组长度明明是10为什么 strlen 却只有5后来才发现我一直把字符数组和字符串混为一谈了。今天就把我踩过的几个坑整理出来希望刚学 C 的朋友少绕一点弯路。坑一字符数组 ≠ 字符串很多人第一次都会觉得char 数组就是字符串。其实不是。例如chars[10]hello;内存真正存的是下标 0 1 2 3 4 5 6 7 8 9 内容 h e l l o \0 ? ? ? ?数组长度是10。真正的字符串只有hello因为它在\0就结束了。为什么会错数组只是存储空间。字符串其实是一段以\0结尾的数据。正确代码chars1[]hello;chars2[10]hello;s1长度是 6包含\0s2长度是 10一句话总结字符数组是容器字符串只是容器里以\0结束的一段内容。坑二别把\0当成普通字符错误示例chars[5]hello;为什么错“hello” 实际需要 6 个字节包含\0。正确代码chars[6]hello;// 或 char s[] hello;一句话总结字符串真正结束的位置不是最后一个字母而是\0。坑三strlen 为什么不是 sizeof错误示例chars[10]hello;printf(%zu\n,strlen(s));printf(%zu\n,sizeof(s));为什么错strlen()统计\0前面的字符数sizeof()统计整个数组大小输出strlen5 sizeof10一句话总结strlen 看字符串长度sizeof 看内存大小。坑四字符串不能直接用 复制错误示例chars1[]hello;chars2[20];s2s1;正确代码chars1[]hello;chars2[20];strcpy(s2,s1);一句话总结字符串复制请用strcpy()。坑五strcat() 不是无限拼接错误示例chars[10]hello;strcat(s,world);为什么错目标数组空间不足会越界。正确代码chars[20]hello;strcat(s,world);一句话总结拼接前先确认目标数组容量。坑六gets() 为什么被淘汰错误示例chars[10];gets(s);为什么错不会检查输入长度容易数组越界。正确代码chars[10];fgets(s,sizeof(s),stdin);一句话总结不要再使用 gets()。今日避坑指南字符数组不等于字符串字符串必须以\0结束strlen()看字符串长度sizeof()看数组大小strcpy()复制字符串strcat()注意空间不要使用gets()今日学习感悟真正理解字符串不是记住几个函数而是理解\0才是 C 字符串结束的标志。以后无论是串口、协议解析还是嵌入式开发这都是必须掌握的基础。下一篇预告为什么冒泡排序这么慢一篇讲透 C 语言三种经典排序算法——排序算法专题三种排序横向对比。