简介

字符串(character string),是多个字符的序列,由一对双引号包裹。如"Hello World!";其中的双引号不是字符串的一部分,仅告知编译器其中的内容是字符串。

char数组

C语言没有专门用于存储字符串的数据类型,而是将其存储在char类型的数组中。

数组是一个相同数据类型元素组成的有序序列,由连续的存储单元组成。

字符串中的字符存储在相邻的存储单元中,每个单元存储一个字符。数组的末尾位置是一个空字符(null character)\0,C语言使用空字符标记字符串的结束,这意味着数组的容量至少比待存储的字符串中的字符多1。

空字符,是一个非打印字符,其ASCII码值是0,因此不是数字0。

如,声明一个10个字符的字符数组,赋值为”Hello World!”,其在内存的大致分布如下:

字符 与 字符串

字符’A’使用单引号,字符串”A”使用双引号。
‘A’是char类型,”A”是char数组,由字符’A’和'\0'组成;

字符串的输入与输出

scanf()在读取输入时,当遇到第一个空白(空格/制表符/换行符)时,就不再读取输入。
因此,C语言提供了其他的输入函数(如fget()),用于读取一般字符串。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
char name[20];
char info[40];
printf("输入你的名字:");
scanf("%s", name);
printf("输入个性签名:");
scanf("%s", info);
printf("名字:%s;个签:%s", name, info);
return 0;
}
1
2
3
输入你的名字:Smith
输入个性签名:Hua kai fu gui~
名字:Smith;个签:Hua

sizeof 与 strlen()

sizeof运算符,是以字节为单位给出对象的大小,包括\0
strlen()函数,返回字符串的实际字符长度,不包括\0

sizeof 与 sizeof()
当运算对象是类型时,使用sizeof(),如sizeof(int),sizeof(char);
当运算对象时特定量时,使用sizeof或sizeof(),如sizeof name,sizeof(3,14);
因此,建议所有情况都使用sizeof()。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
int main()
{
char name[20];
printf("输入你的名字:");
scanf("%s", name);
printf("sizeof name: %zd\n", sizeof name);
printf("sizeof(name): %zd\n", sizeof(name));
printf("strlen(name): %zd\n", strlen(name));
return 0;
}
1
2
3
4
输入你的名字:Smith
sizeof name: 20
sizeof(name): 20
strlen(name): 5

字符串常量

实际编程中,可能会用到一些固定的数值或者字符串,这些变量散落到代码的各个地方,难以维护。因此C提供了常量,方便我们统一管理不经常改动的变量。
通常,常量名为全大写。

符号常量(C预处理器)

使用预处理器在程序顶部定义符号常量(也称明示常量,mainfest constant),其语法为#define NAME value,在编译程序时,代码中所有包含常量NAME的位置都会被替换为value,这个过程称为编译时替换(compile-time substitution)
如:

1
2
#define PAI 3.14159
#define APPNAME "无名"

const限定符