字符串和字符串函数
一、概述
字符串是C语言中最有用、最重要的数据类型之一。但是在C语言中,并未直接给出字符串的数据结构,而是通过字符数组(char[]
)来实现字符串的操作。本文我们就来学习一下C语言中字符串的一些特性。
字符串: 字符串是以空字符 \0
结尾的 char 类型数组。
二、字符串的定义
常见的定义字符串的方式:字符串常量、char 类型数组、指向 char 的指针。
2.1 字符串字面量(常量)
- 用双引号括起来的内容即为字符串常量。
- 编译器会在双引号内的字符末尾自动添加空字符。
- 字符串常量属于静态存储类别。
2.2 字符数组
- 定义字符串数组时,必须指定数组的大小,如: arr[20]。
- 定义数组的大小必须比要存储的字符串多1个字符长度用于在末尾添加一个空字符
\0
。- 数组中未被字符串填充的区域自动被
\0
填充。
2.3 指向 char 的指针
声明一个 char 类型的指针指向字符串的首地址,然后可以通过指针来操作字符串。
下面我们结合代码来一起了解下字符串的定义。
//1.字符串常量:用双引号括起来的内容即为字符串常量。
#define MSG "Hello World!"
int main(void) {
//2.字符数组:数组的大小至少要比字符串大一个字符,用于在末尾存放一个空字符。
char ch[] = "Hello World!";
char ch[20] = "Hello World!";
//3.声明一个指针指向字符串的地址
const char * pt = MSG;
}
2.4 数组与指针的不同点
字符串存储在静态存储区中,当程序被载入内存时,也载入了程序中的字符串。但是,当程序在开始运行时才会为该数组分配内存空间,同时将静态存储区的字符串拷贝一份到数组中。所以此时字符串存在两份,一份在静态存储区,一份在数组中。
- 初始化数组把静态内存区的字符串拷贝到数组中;而初始化指针只是把字符串的地址拷贝给指针。
- 数组名代表数组首元素的地址,是一个常量,因此不能对数组名使用递增运算符(
++
)进行操作。但是可以对指针使用递增运算符。
三、字符串的输入/输出
3.1 字符串的输入
函数声明 | 作用 |
---|---|
char *gets(char *str) | 1. 从 stdin 读取一行 并存入 str 所指向的字符串中。2. 当读取到换行符时,或者到达文件末尾时,该方法会返回。 3. 当读取到数据时,返回str;当读取到EOF时(即读取到文件末尾),返回NULL。 4. 函数读取到换行符时,会丢弃换行符,返回其余的字符。 |
char *fgets(char *str, int n, FILE *stream) | 1. 从指定的流 stream 读取一行,并存入 str 所指向的字符串内。 2. 当读取 (n-1) 个字符时 (留一个字符用于添加空字符) ,或者读取到换行符时,或者到达文件末尾时,该方法会返回。3. 当读取到数据时,返回str;当读取到EOF时(即读取到文件末尾),返回NULL。 4. 函数读取到换行符时,不会丢弃换行符。 |
gets_s(char * str, int n) | C11新增函数。 1. 从标准输入中读取数据。 2. 读取到换行符会丢弃。 |
int scanf(const char *format, ...) | 从标准输入 stdin 读取格式化输入。 |
3.2 字符串的输出
函数声明 | 作用 |
---|---|
int puts(const char *str) | 1. 将 str 所指向的字符串输出到 stdout,直到遇到空字符(空字符不输出)。 2. 在输出字符串时,会自动在其末尾添加一个换行符。 |
int fputs(const char *str, FILE *stream) | 1. 把字符串写入到指定的流 stream 中,但不包括空字符。 2. 不会在输出末尾添加换行符。 |
int fprintf(FILE *stream, const char *format, ...) | 1. 发送格式化输出到流 stream 中。 2. 不会自动在每个字符串后面加一个换行符。 |
int printf(const char *format, ...) | 1. 发送格式化输出到标准输出 stdout。 2. 不会自动在每个字符串后面加一个换行符。 |
3.3 自定义字符串的输入/输出
如果标准库中的字符串输入/输出函数不能满足我们的需求,我们可以使用 getchar()
和 putchar()
函数来自定义相应的字符串操作。
四、常见的字符串函数
函数声明 | 作用 |
---|---|
size_t strlen(const char *str) | 计算字符串str长度。 从首字符开始到遇见空字符\0 为止,但不包括空字符本身。 |
char *strcat(char *dest, const char *src) | 拼接字符串。 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。 |
char *strncat(char *dest, const char *src, size_t n) | 拼接指定长度n的字符串。 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。 |
int strcmp(const char *str1, const char *str2) | 字符串比较。 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。 |
int strncmp(const char *str1, const char *str2, size_t n) | 字符串比较。 把 str1 和 str2 进行比较,最多比较前 n 个字节。 |
char *strcpy(char *dest, const char *src) | 字符串拷贝。 把 src 所指向的字符串复制到 dest。 |
char *strncpy(char *dest, const char *src, size_t n) | 字符串拷贝。 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。 |
int sprintf(char *str, const char *format, ...) | 将对各元素组合成一个字符串。 发送格式化输出到字符串。 |