C — 字符串和字符串函数

一、概述

字符串是C语言中最有用、最重要的数据类型之一。但是在C语言中,并未直接给出字符串的数据结构,而是通过字符数组(char[])来实现字符串的操作。本文我们就来学习一下C语言中字符串的一些特性。

字符串: 字符串是以空字符 \0 结尾的 char 类型数组。


二、字符串的定义

常见的定义字符串的方式:字符串常量、char 类型数组、指向 char 的指针。

2.1 字符串字面量(常量)

  1. 用双引号括起来的内容即为字符串常量。
  2. 编译器会在双引号内的字符末尾自动添加空字符。
  3. 字符串常量属于静态存储类别。

2.2 字符数组

  1. 定义字符串数组时,必须指定数组的大小,如: arr[20]。
  2. 定义数组的大小必须比要存储的字符串多1个字符长度用于在末尾添加一个空字符\0
  3. 数组中未被字符串填充的区域自动被\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 数组与指针的不同点

字符串存储在静态存储区中,当程序被载入内存时,也载入了程序中的字符串。但是,当程序在开始运行时才会为该数组分配内存空间,同时将静态存储区的字符串拷贝一份到数组中。所以此时字符串存在两份,一份在静态存储区,一份在数组中。

  1. 初始化数组把静态内存区的字符串拷贝到数组中;而初始化指针只是把字符串的地址拷贝给指针。
  2. 数组名代表数组首元素的地址,是一个常量,因此不能对数组名使用递增运算符(++)进行操作。但是可以对指针使用递增运算符。

三、字符串的输入/输出

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, ...)将对各元素组合成一个字符串。 发送格式化输出到字符串。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值