信奥竞赛

系列

剑指信奥 | C 语言之字符连成串

回顾数组

同学们一定还记得我们刚刚讲过不久的 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 的下面实现你的回答吧!

日积月累

  • chareacter 字符
  • string 字符串
  • reverse 逆序