 🌏个人博客主页:意疏-CSDN博客
 🌏个人博客主页:意疏-CSDN博客 
阅读指南:
开篇说明
本章节我们学习C语言中一个非常重要的概念 字符串。在C语言编程中,字符串是一种非常重要的数据类型。与许多其他编程语言不同,C语言本身并没有直接提供字符串类型,而是通过字符数组来表示字符串。这种表示方法虽然简单,但也带来了一些需要注意的细节和潜在的陷阱。
在C语言中,字符串通常以字符数组的形式存储,并以空字符(\0)作为字符串的结束标志。例如,字符串 “Hello” 在内存中实际上是以 {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’} 的形式存储的。这种表示方法使得字符串的长度可以动态变化,但也要求程序员在处理字符串时必须小心处理字符串的边界和结束标志。
掌握C语言中的字符串处理技巧,不仅能够帮助我们编写出更高效、更安全的代码,还能让我们更好地理解C语言的底层机制。接下来,我们将深入探讨C语言中字符串的各种操作和注意事项。
ASCll编码
ASCII (American Standard Code for Information Interchange美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符,包括英文字母(大写和小写)、数字、标点符号以及控制字符、如换行符或回车符。
我们来举个例子:以便更好的理解ASCll编码
 #include <stdio.h>  
 int main(){  
     char ch = 'H';  
     printf("ch = %c\n", ch);  
     printf("ch的ASCII码 = %d\n", ch);  
 return 0;  
 }
输出结果是这样子的:
 
 我们可以看到大写H的ASCll码为 72 和下面的编码相对应。读者可以自行一试。
- 以下为ascll编码表 较长,读者可以拖动目录自行阅读。
| 十进制 | 十六进制 | 字符 | 描述 | 
|---|---|---|---|
| 0 | 0x00 | NUL | 空字符 | 
| 1 | 0x01 | SOH | 标题开始 | 
| 2 | 0x02 | STX | 正文开始 | 
| 3 | 0x03 | ETX | 正文结束 | 
| 4 | 0x04 | EOT | 传输结束 | 
| 5 | 0x05 | ENQ | 询问 | 
| 6 | 0x06 | ACK | 确认 | 
| 7 | 0x07 | BEL | 响铃 | 
| 8 | 0x08 | BS | 退格 | 
| 9 | 0x09 | HT | 水平制表符 | 
| 10 | 0x0A | LF | 换行 | 
| 11 | 0x0B | VT | 垂直制表符 | 
| 12 | 0x0C | FF | 换页 | 
| 13 | 0x0D | CR | 回车 | 
| 14 | 0x0E | SO | 移出 | 
| 15 | 0x0F | SI | 移入 | 
| 16 | 0x10 | DLE | 数据链路转义 | 
| 17 | 0x11 | DC1 | 设备控制1 | 
| 18 | 0x12 | DC2 | 设备控制2 | 
| 19 | 0x13 | DC3 | 设备控制3 | 
| 20 | 0x14 | DC4 | 设备控制4 | 
| 21 | 0x15 | NAK | 否定 | 
| 22 | 0x16 | SYN | 同步空闲 | 
| 23 | 0x17 | ETB | 传输块结束 | 
| 24 | 0x18 | CAN | 取消 | 
| 25 | 0x19 | EM | 介质结束 | 
| 26 | 0x1A | SUB | 替换 | 
| 27 | 0x1B | ESC | 转义 | 
| 28 | 0x1C | FS | 文件分隔符 | 
| 29 | 0x1D | GS | 组分隔符 | 
| 30 | 0x1E | RS | 记录分隔符 | 
| 31 | 0x1F | US | 单元分隔符 | 
| 32 | 0x20 | SP | 空格 | 
| 33 | 0x21 | ! | 感叹号 | 
| 34 | 0x22 | " | 双引号 | 
| 35 | 0x23 | # | 井号 | 
| 36 | 0x24 | $ | 美元符号 | 
| 37 | 0x25 | % | 百分号 | 
| 38 | 0x26 | & | 和号 | 
| 39 | 0x27 | ’ | 单引号 | 
| 40 | 0x28 | ( | 左括号 | 
| 41 | 0x29 | ) | 右括号 | 
| 42 | 0x2A | * | 星号 | 
| 43 | 0x2B | + | 加号 | 
| 44 | 0x2C | , | 逗号 | 
| 45 | 0x2D | - | 减号 | 
| 46 | 0x2E | . | 句号 | 
| 47 | 0x2F | / | 斜杠 | 
| 48 | 0x30 | 0 | 数字0 | 
| 49 | 0x31 | 1 | 数字1 | 
| 50 | 0x32 | 2 | 数字2 | 
| 51 | 0x33 | 3 | 数字3 | 
| 52 | 0x34 | 4 | 数字4 | 
| 53 | 0x35 | 5 | 数字5 | 
| 54 | 0x36 | 6 | 数字6 | 
| 55 | 0x37 | 7 | 数字7 | 
| 56 | 0x38 | 8 | 数字8 | 
| 57 | 0x39 | 9 | 数字9 | 
| 58 | 0x3A | : | 冒号 | 
| 59 | 0x3B | ; | 分号 | 
| 60 | 0x3C | < | 小于号 | 
| 61 | 0x3D | = | 等于号 | 
| 62 | 0x3E | > | 大于号 | 
| 63 | 0x3F | ? | 问号 | 
| 64 | 0x40 | @ | 艾特符号 | 
| 65 | 0x41 | A | 大写字母A | 
| 66 | 0x42 | B | 大写字母B | 
| 67 | 0x43 | C | 大写字母C | 
| 68 | 0x44 | D | 大写字母D | 
| 69 | 0x45 | E | 大写字母E | 
| 70 | 0x46 | F | 大写字母F | 
| 71 | 0x47 | G | 大写字母G | 
| 72 | 0x48 | H | 大写字母H | 
| 73 | 0x49 | I | 大写字母I | 
| 74 | 0x4A | J | 大写字母J | 
| 75 | 0x4B | K | 大写字母K | 
| 76 | 0x4C | L | 大写字母L | 
| 77 | 0x4D | M | 大写字母M | 
| 78 | 0x4E | N | 大写字母N | 
| 79 | 0x4F | O | 大写字母O | 
| 80 | 0x50 | P | 大写字母P | 
| 81 | 0x51 | Q | 大写字母Q | 
| 82 | 0x52 | R | 大写字母R | 
| 83 | 0x53 | S | 大写字母S | 
| 84 | 0x54 | T | 大写字母T | 
| 85 | 0x55 | U | 大写字母U | 
| 86 | 0x56 | V | 大写字母V | 
| 87 | 0x57 | W | 大写字母W | 
| 88 | 0x58 | X | 大写字母X | 
| 89 | 0x59 | Y | 大写字母Y | 
| 90 | 0x5A | Z | 大写字母Z | 
| 91 | 0x5B | [ | 左方括号 | 
| 92 | 0x5C | |反斜杠 | |
| 93 | 0x5D | ] | 右方括号 | 
| 94 | 0x5E | ^ | 脱字符 | 
| 95 | 0x5F | _ | 下划线 | 
| 96 | 0x60 | ` | 反引号 | 
| 97 | 0x61 | a | 小写字母a | 
| 98 | 0x62 | b | 小写字母b | 
| 99 | 0x63 | c | 小写字母c | 
| 100 | 0x64 | d | 小写字母d | 
| 101 | 0x65 | e | 小写字母e | 
| 102 | 0x66 | f | 小写字母f | 
| 103 | 0x67 | g | 小写字母g | 
| 104 | 0x68 | h | 小写字母h | 
| 105 | 0x69 | i | 小写字母i | 
| 106 | 0x6A | j | 小写字母j | 
| 107 | 0x6B | k | 小写字母k | 
| 108 | 0x6C | l | 小写字母l | 
| 109 | 0x6D | m | 小写字母m | 
| 110 | 0x6E | n | 小写字母n | 
| 111 | 0x6F | o | 小写字母o | 
| 112 | 0x70 | p | 小写字母p | 
| 113 | 0x71 | q | 小写字母q | 
| 114 | 0x72 | r | 小写字母r | 
| 115 | 0x73 | s | 小写字母s | 
| 116 | 0x74 | t | 小写字母t | 
| 117 | 0x75 | u | 小写字母u | 
| 118 | 0x76 | v | 小写字母v | 
| 119 | 0x77 | w | 小写字母w | 
| 120 | 0x78 | x | 小写字母x | 
| 121 | 0x79 | y | 小写字母y | 
| 122 | 0x7A | z | 小写字母z | 
| 123 | 0x7B | { | 左花括号 | 
| 124 | 0x7C | ||
| 125 | 0x7D | } | 右花括号 | 
| 126 | 0x7E | ~ | 波浪号 | 
| 127 | 0x7F | DEL | 删除 | 
字符串
字符串是一个或多个的序列,例如:
- 字符串的定义:
 字符串:C语言并没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中,数组由连续的存储单元组成,字符串中的字符都被存储在相邻的存储单元中,每个单元存储一个字符。
 问题来了,我们该如果区分字符数组和字符串呢?
 C语言中字符串一定以’\0’(空字符)结束。这意味着数组的容量必须至少比待存储字符串中的字符数多1.
 注:
 '0’是控制字符,非打印字符,只是做标记,在实际打印时不会被显示的打印。
- 字符数组和字符串的输入输出
 1、字符数组的输入输出,用格式符号"%c"逐个输入。
 例如:
#include <stdio.h>
int main(){
    int i;
    char ch[5];
    printf("请输入字符: \n");
    for (i = 0; i < 5; i++)
    {
        scanf("%c", &ch[i]);//ch[i] 是一个char型变量,用来接收输入的字符,&ch[i]表示ch[i]的地址,即ch[i]的指针。(取地址)
    }
    printf("您输入的字符是: \n");
    for ( i = 0; i < 5; i++)
    {
        printf("%c", ch[i]);//输出ch数组中的字符
    }
    printf("\n");
return 0;
}
结果为:
 
 2、字符串的输入输出、将整个字符串一次输入或输出,用"%s"格式符。
 例如:
#include <stdio.h>
int main(){
    char ch[6];//定义一个字符数组,因为要输入'\0',所以长度要比字符串大 1
    scanf("%s",ch);//数组名前不加&,表示是地址,而不是指针
    printf("%s\n",ch);
return 0;
}
结果为:
 
什么是以’0’结尾呢?
 再举个例子:我们来先定义一个字符串数组
这里我们定义了一个大小为40,类型是char的数组。然后键盘录入一个姓氏,以字符串的形式存储在name中,最后打印。
- 代码如下:
#include <stdio.h>
int main(){
    char name[40];
    printf("请输入你的名字: ");
    scanf("%s", name);//字符串转换说明%s 
    //数组名前不加&,C语言中数组名代表数组第一个元素的地址
    printf("我的名字是 %s!\n", name);
return 0;
}
运行结果:
 
 这里当程序看到%s时,就知道你输入的是一个字符串,同样会自动在结尾加上’0’.
 当计算机读取到第一个空字符’0’就知道在此之前是一个完整的字符串,并将其输出。











