同学们一定还记得我们刚刚讲过不久的 C 语言中的数组吧,再来回忆一下:
在程序设计中,变量是指一个包含部分已知或未知数值的储存空间,以及相对应的符号名称(变量名)
Wikipedia
我们来看这段代码:
int main() {
// 声明 int 数组
int array[10];
}
简单的几行代码,我们声明了一个长度为 10 的整形数组,这里面可以存储 10 个整数。
那么除了整数之外,我们是否可以定义其他类型的数组?
当然可以,今天,我们就来看一种具有特别含义的数组 —— 字符数组。
在 C 语言中,有一种数据类型非常特别,它不是各种各样的数字,而是由字符 character来组成的 ——
在电脑和电信领域中,字符(Character)是一个资讯单位。
对使用字母系统或音节文字等自然语言,它大约对应为一个音位、类音位的单位或符号。
简单来讲就是一个汉字、假名、韩文字……,或是一个英文、其他西方语言的字母。
Wikipedia
看一个字符类型的变量定义和赋值:
#include <stdio.h>
int main() {
char c = 'a';
printf("%c", c);
}
在 C 语言中,我们用 char 代表字符类型,用字符类型定义的变量可以存储一个字节的字符。
那么我们想要表示多个字符怎么办呢?
数组就派上了用场,因为我们可以定义一个由字符组成的数组,而这就是我们今天要讲的主题 —— 字符串。
字符串 string 在 C 语言中表现为一个由字符组成的数组。
在几乎所有的现代计算机语言中,字符串都是一个非常重要的内容,毕竟我们人类使用语言文字来交流的,海量的问题都需要由字符串来解决。
我们来看一下 C 中字符串的声明和赋值:
#include <stdio.h>
int main() {
// 字符串表现为字符数组
char s[] = "abc";
printf("%s", s); // 输出 abc
}
我们声明了一个字符串的数组 s,而为它赋值为由双引号包含的 “abc”,这就是一个字符串。
我们也可以在一开始,定义好字符数组的长度:
#include <stdio.h>
int main() {
// 声明时定义元素为 4
char s[4] = "abc";
printf("%s", s); // 输出 abc
}
这次,我们在声明时,定义字符数组的元素为 4 个,存储的内容依然为 “abc”,输出的结果还是一样的 —— 但是,疑问出现了...
我们要存储的内容只含有 3 个字符,而数组定义的元素为 4 个,是不是有点浪费了?3 个元素不就够用了吗?
那我们就来试一试:
#include <stdio.h>
int main() {
// 声明时定义元素为 3
char s[3] = "abc";
printf("%s", s); // 输出 abc�Z��
}
这次我们定义数组长度为3,用来存储字符串 “abc”,最后结果虽然出现了 “abc”,但后面还出现了一些看不懂的乱码,所以这样做是有问题的!
原来,C 语言中的字符数组有一点非常特别的地方,就是每个字符数组的最后一个元素都是固定不变的字符 \0,因此,只有 4 个元素能满足我们的需求:
s[0] | s[1] | s[2] | s[3] |
---|---|---|---|
a | b | c | \0 |
所以我们试图把 ‘a’ 'b' 'c' '\0' 这 4 个字符元素放入一个只能存放 3 个元素的数组是无法实现的,这一点一定要注意避免。
好,这些就是 C 语言中关于字符串最为基础的内容,基于这部分知识,我们来做一个趣味题:
字符串的逆序
问题描述完成字符串的逆序输出
输入格式字符串 “Hello, String!”
输出格式逆序结果 "!gnirtS ,olleH"
这道题是把字符串进行逆序 reverse处理,就是把原字符串反向输出。
代码片段是这样的:
#include <stdio.h>
int main() {
// 原字符串
char s[] = "Hello, World!";
// TODO 实现原字符串的逆序,并输出
}
思考一下,在 TODO 的下面实现你的回答吧!