ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

8.字符和字符串

2026/9/27 21:42:59 拓冰建站 浏览量
8.字符和字符串 一、单个字符 char1. 什么是 charchar 就像只能放 1 个小格子只能存 1 个符号字母、数字、逗号、空格都可以。✅ 可以A、7、 空格❌ 不可以AB一个格子塞不下两个字符。2. 单引号使用规则必背单引号 包裹【1 个字符】char ch1 a; char ch2 5; char ch3 ; // 空格字符空格也是一个字符❌ 错误char ch ab;大白话单引号一次只能装一个ab 是两个塞不进去。3. ASCII 底层规则字符本质是数字电脑只认识数字不认识字母文字。 所以约定好一张对照表ASCII 表每个字符对应一个固定数字。类比每个同学有学号A这个同学学号是 65a学号 97。电脑存的是学号打印的时候再翻译成字母。常用编码数字字符048~957大写字母A65~Z90小写字母a97~z122大小写转换公式小写字母 对应大写字母 32大写字母 对应小写字母 - 32例子A学号 65653297 → 97 就是am是 109109-3277 →77 就是M代码演示#includestdio.h int main() { char c A; printf(文字%c对应ASCII数字%d, c, c); // %c打印字符看文字%d打印它的ASCII学号看数字 return 0; }运行结果文字A对应 ASCII 数字654. 字符支持加减、自增运算既然 char 存的本质是数字学号那就可以做加减、c。示例循环打印 A~Z#includestdio.h int main() { char c A; while(c Z) { printf(%c , c); c; // 学号1下一个字母 } return 0; }大白话c 一开始是A(65)每次 1一直到Z(90)停止。输出A B C ... Z5. 单个字符输入输出打印字符占位符%cscanf读取单个字符变量前面必须写char ch; scanf(%c, ch);坑点scanf(%c)会把回车、空格当成字符读进去例子 你输入5然后按回车。 键盘输入的内容会暂时存放在缓冲区缓冲区里面存了两个东西5和\n回车。 如果后面再写一个scanf(%c, ch2);它不会等你输入直接把回车拿走赋值给 ch2。 程序看起来 “跳过输入”。✅ 解决办法读完之后加一句getchar();吃掉缓冲区里残留的回车。#include stdio.h int main() { char ch1, ch2; scanf(%c, ch1); getchar(); // 吃掉残留回车 scanf(%c, ch2); return 0; }备选小技巧scanf( %c, ch2);%c前面加空格自动跳过回车、空格空白字符。注意getchar()一次只能吃掉 1 个字符。6. 字符判断条件做题高频// 判断是不是大写字母字符在A到Z之间 ch A ch Z // 判断是不是小写字母字符在a到z之间 ch a ch z // 判断是不是数字字符字符在0到9之间 ch 0 ch 9⚠️重点区分0是字符ASCII 是 48数字 0 就是数字 0两者完全不一样7. 转义字符特殊排版符号以反斜杠\开头用来表示没法直接敲出来的特殊字符。表格转义字符作用大白话\n换行相当于敲一下回车\t空一段固定空格对齐文字\\在屏幕打印一个反斜杠 |\在屏幕打印单引号 \在屏幕打印双引号 例子printf(Hello\nWorld);输出Hello World二、字符串一整段连续文字1. 字符串基础概念单个字符一个符号。字符串一串连续字符。 例子hello、张三重点C 语言没有单独叫 “字符串” 的变量类型。字符串靠一堆连续 char 格子字符数组实现。2. 双引号使用规则字符串必须用 双引号 包裹可以写多个字符。 区分记忆超级重要A单引号单个字符1 个格子A双引号字符串不止 1 个格子3. 字符串结束标记\0核心重点只要写双引号字符串编译器会自动偷偷在文字末尾塞一个\0。\0ASCII 编号 0字符串结束牌子。电脑读到\0才知道文字到此结束。生活化类比abc看着是 3 个字母。内存里存a b c \0。一共占 4 个格子。\0就像一句话末尾的句号告诉电脑文字读完了 如果没有\0电脑不知道哪里是结尾会继续往后面乱读内存打印一堆乱码。4. 字符串打印占位符%s%s专门用来一次性打印一整串文字不用循环一个个输出字符。printf(%s, 我是字符串);三、两种字符串存储方式方式 1字符串常量内容不可修改char *str apple;大白话apple放在一块只读内存相当于刻在石碑上的文字。只能看不能改。错误示例运行崩溃#include stdio.h int main() { char *str apple; str[0] b; // 想把石碑第一个字母改成b不允许程序崩溃 printf(%s, str); return 0; }方式 2字符数组存储字符串做题首选可以修改字符数组相当于手写在草稿纸上的文字可以擦掉重写。写法 1双引号直接赋值自动补全\0char arr[] banana;数组格子数量自动算文字个数 1留给\0结束标记写法 2手动逐个写字符必须手动加\0char arr[6] {h,e,l,l,o,\0};不写\0就没有结束标记不是合法字符串打印乱码。易错例子char arr[5] hello;hello 一共 5 个字母数组只开了 5 个格子。但是字符串还需要多 1 格放\0空间不够。 ✅不会编译报错但内存没有结束标记打印乱码。可修改字符串示例#include stdio.h int main() { char str[] apple; str[0] b; // 草稿纸第一个字符改成b printf(%s, str); // 输出 bpple return 0; }四、字符串键盘输入1. scanf 读取字符串char str[20]; scanf(%s, str);大白话str 是数组名字数组名本身就代表起始地址不用加缺点读到空格或者回车就立刻停止读取。 例子输入hello worldscanf 只会读到hello空格后面的world丢掉。2. fgets 读取完整一行推荐可以读空格想输入带空格的句子例如I love C用 fgets。char str[30]; fgets(str, 30, stdin);参数说明str 存放文字30 最多读取字符数量stdin 代表键盘输入。⚠️新手大坑fgets 会把你敲的回车\n一并读到字符串里面 例子输入 hi回车。 数组里面存的是h i \n \0 后面用 strcmp一个字符串比较函数比较的时候hi和 fgets 读到的hi\n判定不相等考试高频坑。❌禁止使用 gets 函数有严重安全漏洞新版 C 语言删掉了考试见到直接判错。五、循环遍历字符串逻辑从下标 0 开始逐个取出字符读到\0就停止循环。#includestdio.h int main() { char str[] abcd; int i 0; while(str[i] ! \0) // 只要不是结束标记继续读 { printf(%c , str[i]); i; } return 0; }大白话i 是数组格子编号。 str [0]astr [1]bstr [2]cstr [3]dstr [4]\0。读到\0循环结束。原理这就是 strlen 函数底层实现思路数一共有多少个可见字符。配套练习输入一句话统计里面大写字母、小写字母、数字分别有多少个。六、字符串工具函数需要头文件#include string.h相当于 C 语言自带工具箱不用自己写循环。1. strlen 计算字符串有效长度只统计看得见的字符不算末尾隐藏的\0char str[] 12345; int len strlen(str); // len结果等于5例子abcstrlen 结果是 3不是 4。\0不算。2. strcpy 字符串复制把一段文字完整复制到字符数组自动带上\0。 ⚠️目标数组空间必须足够大装得下全部文字空间不足会造成内存越界程序出错。char a[20]; char b[] 橘子; strcpy(a, b); // 把b里面的橘子复制到a数组类比把 b 草稿纸上的字完整抄写到 a 草稿纸上。3. strcat 字符串拼接把第二段文字追加到第一段文字末尾合并文字。 ⚠️目标数组剩余空间必须足够空间不足会造成内存越界程序出错。char s[30] 你好; strcat(s, 世界); // 拼接后 s 里面你好世界类比草稿纸上写了 “你好”接着在后面续写 “世界”。4. strcmp 对比两段字符串是否相同⚠️超级大坑不能用判断两个字符串数组是否相等必须用 strcmp 大白话比较的是数组地址不是里面文字内容。 strcmp 规则两个字符串从左往右逐个字符对比遇到第一个不一样的字符就停止。完全一模一样 → 返回 0第一段字符的 ASCII 码更大 → 返回正数第一段字符的 ASCII 码更小 → 返回负数char s1[] abc; char s2[] abd; if(strcmp(s1, s2) 0) printf(两段文字完全相同);七、小白高频易错点总结考前背诵单引号装单个字符双引号装字符串不能混用C 语言合法字符串末尾必须自带\0没有\0打印乱码scanf(%c, ch)读单个 char 变量要写scanf(%s, str)读字符数组字符串不加 判断两个字符串内容相等不能写 要用strcmp0字符ASCII48、数字 0、\0结束标记 ASCII0三者完全不是一回事strlen只统计可见文字数量不包含末尾\0scanf(%c)会读回车空格缓冲区残留回车可以用getchar()清理char *strxxx字符串常量是只读的不能修改char str[]xxx字符数组可以修改fgets读取一行时会把回车\n一起读进字符串gets函数已经废除禁止使用