news 2026/2/9 16:34:51

通俗易懂C语言:字符、字符串和语句

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通俗易懂C语言:字符、字符串和语句

一、字符与ASCII编码:机制与设计原理

1. 字符的本质与计算机表示

在 C 语言里,字符在 C 语言中存储的不是一种“文字”,而是一个数字

在计算机系统中,所有数据最终以二进制形式存储和处理。字符作为信息的基本单位,必须通过某种映射规则转换为整数,才能被计算机识别和操作。这种映射规则即字符编码(character encoding)。C语言本身不定义字符的语义,而是依赖于底层执行环境所采用的字符集(character set)。

例如:

  • 字母'A'实际上被存储为数字65
  • 字母'B'66
  • 数字'0'48
  • 换行符'\n'10

这些对应关系来自一个叫ASCII 编码表的标准。

2. ASCII编码的设计原理

ASCII(American Standard Code for Information Interchange)是一种7位字符编码标准,定义了128个字符(0–127)。其设计具有以下结构性特征:

  • 控制字符(0–31 和 127):用于通信控制(如换行 \n = 10,回车 \r = 13)。
  • 可打印字符(32–126):包括空格(32)、数字(48–57)、大写字母(65–90)、小写字母(97–122)及其他符号。

列标题

  • Decimal→ 十进制
  • Binary→ 二进制
  • Octal→ 八进制
  • Hex→ 十六进制

控制字符关键字讲解

这些字符不可打印,主要用于早期电脑、打印机、通信设备的控制。以下按表格顺序逐一讲解:

十进制十六进制缩写全称(英文)中文名称/含义常见用途/说明
000NULNull空字符填充用,常表示字符串结束(C语言中’\0’)
101SOHStart of Heading标题开始通信协议中表示信息头开始
202STXStart of Text正文开始表示正文数据开始
303ETXEnd of Text正文结束表示正文数据结束
404EOTEnd of Transmission传输结束表示整个传输结束(如Ctrl+D结束输入)
505ENQEnquiry请求请求对方回应
606ACKAcknowledge确认通信中表示收到数据无误
707BELBell响铃使终端发出“叮”声(早期蜂鸣器)
808BSBackspace退格光标左移一格,常用于删除前一个字符
909HTHorizontal Tab水平制表符(横向跳格)跳到下一个制表位(Tab键)
100ALFLine Feed换行光标向下移一行(Unix/Linux换行符\n)
110BVTVertical Tab垂直制表符垂直跳格(较少用)
120CFFForm Feed换页打印机 eject 当前页(清屏或换页)
130DCRCarriage Return回车光标回到行首(Windows换行符\r\n中的\r)
140ESOShift Out移出(切换到备用字符集)切换到另一字符集(较少用)
150FSIShift In移入(切换回标准字符集)切换回标准字符集
1610DLEData Link Escape数据链路转义通信中转义控制
1711DC1Device Control 1设备控制1常用于开启设备(如XON)
1812DC2Device Control 2设备控制2
1913DC3Device Control 3设备控制3常用于暂停设备(如XOFF)
2014DC4Device Control 4设备控制4
2115NAKNegative Acknowledge否定确认表示收到数据有误
2216SYNSynchronous Idle同步空闲通信同步用
2317ETBEnd of Transmission Block传输块结束表示一个数据块结束
2418CANCancel取消取消当前操作
2519EMEnd of Medium介质结束表示存储介质结束
261ASUBSubstitute替换替换无效字符
271BESCEscape转义开始转义序列(Esc键,常用于终端控制)
281CFSFile Separator文件分隔符分隔文件
291DGSGroup Separator组分隔符分隔组
301ERSRecord Separator记录分隔符分隔记录
311FUSUnit Separator单元分隔符分隔单元
1277FDELDelete删除删除字符(早期打孔纸带上全打孔表示删除)
可打印字符(32~126)
这部分都是日常看到的字符:
  • 32:空格(SP,Space)
  • 33~47:标点符号 ! " # $ % & ’ ( ) * + , - . /
  • 48~57:数字 0~9
  • 58~64:标点符号 : ; < = > ? @
  • 65~90:大写字母 A~Z
  • 91~96:标点符号 [ \ ] ^ _ `
  • 97~122:小写字母 a~z
  • 123~126:标点符号 { | } ~
3. C语言中字符类型的实现机制

C 语言提供了一个专门的数据类型:char(全称 character,意为“字符”)。

charc='A';// 把字符 A 存到变量 c 中

注意:

  • 字符必须用单引号' '包起来;
  • 'A'"A"不一样:'A'是字符,"A"是字符串。

虽然char用来存字符,但它本质上是一个很小的整数,只能存 -128 到 127 或 0 到 255 之间的数。

使用printf查看字符对应的数字(ASCII 值) , 用%c表示输出字符, 用%d表示输出数字:

#include<stdio.h>intmain(){charc='A';printf("字符是:%c\n",c);// 输出:Aprintf("ASCII值是:%d\n",c);// 输出:65return0;}

同一个变量c,用%c看是字母,用%d看是数字,这说明:字符和数字在内存中是一回事,只是显示方式不同。

4. 特殊字符:转义字符

有些字符不能直接打出来(比如换行、制表符),C 语言用反斜杠\开头表示它们:

写法含义ASCII 值
\n换行10
\t水平制表(Tab)9
\\反斜杠本身92
\'单引号39
\"双引号34
\0空字符(值为0)0

例子:

printf("第一行\n第二行");// 输出两行printf("a\tb\tc");// 用 Tab 对齐

二、字符串:机制与设计原理

1. 什么是字符串

在 C 语言中,字符串就是一串字符连在一起,比如:

"Hello" "123" "C language"

字符串必须用 双引号 " 包起来,而单个字符用单引号 '。这是重要区别。

char c = 'A'; // 单个字符 char s[] = "A"; // 字符串(包含两个字符:'A' 和 '\0')

C 语言没有专门的“字符串类型”。它用char数组来存字符串。

例如:

charname[]="Tom";

这行代码的意思是:

  • 创建一个char类型的数组,名字叫name
  • "Tom"这个字符串存进去。

实际上,name数组里存了4 个字符

索引0123
‘T’‘o’‘m’'\0'

最后一个字符'\0'叫做空字符(null character),它的 ASCII 值是 0。

C 语言规定:所有字符串末尾必须有一个'\0',用来标记“字符串到这里结束”。这个'\0'是编译器自动加的,不需要写。

printf%s格式打印字符串:

#include<stdio.h>intmain(){charword[]="Hello";printf("%s\n",word);// 输出:Helloreturn0;}

%s会从数组开头一直打印,直到遇到'\0'为止。

2. 如何知道字符串有多长?

你可以自己数,但 C 提供了一个函数:strlen()(需要包含<string.h>)。

#include<stdio.h>#include<string.h>intmain(){chars[]="Hi!";intlen=strlen(s);printf("长度是:%d\n",len);// 输出:3return0;}

注意:strlen返回的是实际字符个数不包括最后的'\0'

3. 字符串和字符数组的关系

你可以把字符串看作一种特殊的char数组。你也可以手动创建字符数组:

chara[6]={'H','e','l','l','o','\0'};

这和char a[] = "Hello";效果一样。

一定要记得加'\0',否则printf("%s", a)可能会打印乱码或崩溃。

4. 常见操作:读写字符串
(1)从键盘输入字符串

scanf读一个单词(不能有空格):

#include<stdio.h>intmain(){charname[50];// 最多存 49 个字符 + 1 个 '\0'printf("请输入你的名字:");scanf("%s",name);printf("你好,%s!\n",name);return0;}

三、C语言语句:机制与设计原理

1. 什么是“语句”?

在 C 语言中,语句(statement)是程序执行的最小独立单位,语句就是让计算机做一件事的一行命令。每条语句以分号;结尾。

例如:

inta=5;// 定义变量并赋值 → 一条语句printf("Hello");// 输出文字 → 一条语句a=a+1;// 计算并赋值 → 一条语句

程序就是由一条条语句按顺序执行组成的。

2. 语句的本质与抽象模型

在C语言中,语句(statement)是程序执行的基本单位,用于表达计算、控制流或声明作用域。C标准(ISO/IEC 9899)将语句分为六类:表达式语句、复合语句、选择语句、迭代语句、跳转语句和标签语句。所有语句最终被编译器翻译为底层机器指令序列。

类别作用常见例子
表达式语句执行一个计算或操作x = 5;i++;printf(...);
复合语句把多条语句组合成一个整体{ }包起来的代码块
选择语句根据条件选择执行哪一段代码if,switch
循环语句重复执行某段代码for,while,do-while
跳转语句直接跳到程序的另一处break,continue,return
标签语句为跳转提供目标位置(很少用)loop: ...

C语言采用顺序执行模型:除显式控制流语句外,语句按源代码书写顺序依次执行。这一模型建立在冯·诺依曼架构的“指令指针递增”机制之上,通过条件分支和循环实现非线性控制流。语句本身不返回值(区别于表达式),但可通过副作用(如修改内存、调用函数)影响程序状态。

3. 表达式语句:计算与副作用的载体

表达式语句由一个表达式后接分号构成,形式为expression;。其核心作用是求值并丢弃结果,仅保留副作用。例如:

x=5;// 赋值表达式,副作用:修改xprintf("OK");// 函数调用表达式,副作用:输出i++;// 后缀自增,副作用:i增加1

值得注意的是,即使表达式无实际用途,只要语法合法即可构成语句:

42;// 合法但无意义(编译器通常警告)

表达式语句是C语言“一切操作皆表达式”哲学的体现——赋值、函数调用、自增等均具有值和副作用,语句层仅关注副作用的触发。

4. 复合语句:作用域与块结构

复合语句(compound statement),又称块(block),由花括号{}包围的声明与语句序列组成:

{intx=10;// 声明x+=5;// 语句printf("%d",x);}

复合语句引入局部作用域(local scope):在块内声明的标识符仅在该块及其嵌套块中可见,生命周期从声明点开始,到块结束时终止。此机制支持变量的局部化,减少命名冲突,并允许资源(如栈上对象)的自动管理。

关键性质:

  • 块可嵌套,内层块可遮蔽(shadow)外层同名标识符;
  • 块本身不产生运行时开销(无额外指令),仅为编译期作用域划分;
  • 空块{}是合法语句,常用于宏定义或占位。
5. C语言中的注释(Comment)

注释是写给“人”看的说明文字,不是给计算机执行的代码
编译器在编译程序时会直接忽略所有注释,它们不会影响程序运行。

作用:

  • 解释代码的功能
  • 标记待完成的任务
  • 临时禁用某段代码(调试时)
5.1单行注释://

//开始,到当前行末尾为止,都是注释。

// 这是一条单行注释intage=18;// 这行代码定义年龄变量
5.2多行注释:/* ... */

/*开始,到*/结束,中间所有内容都是注释,可以跨多行

/* 这是一个多行注释 可以写很多行说明 */intscore=90;

注意:/* */不能嵌套
错误示例:

/* 外层注释 /* 内层注释 */ // 编译错误! */

注释的常见用途

场景示例
解释变量含义int n; // 学生人数
说明复杂逻辑// 如果分数 >=60,则及格
暂时禁用代码// printf("调试信息\n");
标记待办事项// TODO: 添加输入验证

注:本文是本账号作者撰写,AI仅用于校对及整理。转载请注明出处及原作者。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 20:31:39

为什么你的游戏画面总是差一截?,深度剖析C++渲染质量关键因素

第一章&#xff1a;为什么你的游戏画面总是差一截&#xff1f;——C渲染质量的宏观视角在高性能游戏开发中&#xff0c;C依然是构建底层图形引擎的首选语言。然而&#xff0c;即便使用了DirectX或Vulkan这样的先进API&#xff0c;许多开发者仍发现最终呈现的画面质感与商业大作…

作者头像 李华
网站建设 2026/2/9 14:04:31

【C++网络编程错误处理终极指南】:掌握9种常见异常的优雅应对策略

第一章&#xff1a;C网络编程中的错误处理概述在C网络编程中&#xff0c;错误处理是确保程序健壮性和可靠性的核心环节。网络通信涉及系统调用、套接字操作和数据传输等多个层面&#xff0c;任何环节的异常都可能导致程序崩溃或数据丢失。因此&#xff0c;合理捕获并响应错误至…

作者头像 李华
网站建设 2026/2/7 22:26:51

轻量化模型训练趋势:lora-scripts在移动端适配前景分析

轻量化模型训练趋势&#xff1a;lora-scripts在移动端适配前景分析 如今&#xff0c;AI正从“云端霸权”走向“端侧普惠”。我们不再满足于用强大的服务器运行大模型&#xff0c;而是希望手机、手表甚至耳机也能拥有个性化的智能能力。但现实是&#xff1a;Stable Diffusion 生…

作者头像 李华
网站建设 2026/2/9 14:23:07

[Day2] 建立模块和仓库

仓库 当然使用github进行管理。但是这次并不是单独一个仓库&#xff0c;而是使用submodules进行管理。也就是说结构变成 一个主仓库关联多个子仓库&#xff0c;其中主仓库存储这子仓库某个版本的id&#xff0c;这样就可以追踪到子仓库快照。 为什么采用这个&#xff1f; 同事用…

作者头像 李华
网站建设 2026/2/10 6:16:47

从入门到精通:掌握lora-scripts全流程操作手册

从入门到精通&#xff1a;掌握 lora-scripts 全流程操作手册 在生成式 AI 的浪潮中&#xff0c;个性化模型训练正从实验室走向千行百业。无论是设计师想打造专属画风&#xff0c;还是企业希望构建行业专属的问答系统&#xff0c;直接微调整个大模型显然不现实——动辄上百 GB …

作者头像 李华