C 语言库函数中已经给我们提供了丰富的字符串处理相关函数,基本常见的字符串处理需求都可
以直接使用这些库函数来实现。
1. 字符串输入/输出
在程序当中,经常需要在程序运行过程中打印出一些信息,譬如调试信息、报错信息、中间产生的变量的值等等,以实现对程序运行状态的掌控和分析。
1.1 字符串输出
常用的字符串输出函数有 putchar() 、 puts() 、 fputc() 、 fputs() ,前面我们经常使用 printf() 函数来输出字符串信息,而并没有使用到 putchar() 、 puts() 、 fputc() 、 fputs() 这些函数,原因在于 printf() 可以按照自己规定的格式输出字符串信息,一般称为格式化输出;而 putchar() 、 puts() 、 fputc() 、 fputs() 这些函数只能输出字符串,不能进行格式转换。
与 printf()一样,putchar()、puts()、fputc()、fputs()这些函数也是标准 I/O 函数,属于标准 C 库函数。
puts 函数
puts() 函数用来向标准输出设备(屏幕、显示器)输出字符串并自行换行。把字符串输出到标准输出设备,将' \0 ' 转换为换行符 ' \n ' 。 puts 函数原型如下:
#include <stdio.h>
int puts(const char *s);
函数参数和返回值解释如下:
s : 需要进行输出的字符串。
返回值: 成功返回一个非负数;失败将返回 EOF , EOF 其实就是 -1 。
putchar 函数
putchar() 函数可以把参数 c 指定的字符(一个无符号字符)输出到标准输出设备,其输出可以是一个字符,可以是介于 0~127 之间的一个十进制整型数(包含 0 和 127 ,输出其对应的 ASCII 码字符),也可以是用 char 类型定义好的一个字符型变量。 putchar 函数原型如下:
#include <stdio.h>
int putchar(int c);
函数参数和返回值解释如下:
c : 需要进行输出的字符。
返回值: 出错将返回 EOF 。
fputc 函数
fputc() 与 putchar() 类似,也用于输出参数 c 指定的字符(一个无符号字符),与 putchar() 区别在于, putchar()只能输出到标准输出设备,而 fputc() 可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。fputc 函数原型如下:
#include <stdio.h>
int fputc(int c, FILE *stream);
函数参数和返回值解释如下:
c : 需要进行输出的字符。
stream : 文件指针。
返回值: 成功时返回输出的字符;出错将返回 EOF 。
fputs 函数
fputs() 与 puts() 类似,也用于输出一条字符串,与 puts() 区别在于, puts() 只能输出到标准输出设
备,而 fputs() 可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。函数原型如下:
#include <stdio.h>
int fputs(const char *s, FILE *stream);
函数参数和返回值解释如下:
s : 需要输出的字符串。
stream : 文件指针。
返回值: 成功返回非负数;失败将返回 EOF 。
1.2 字符串输入
常用的字符串输入函数有 gets() 、 getchar() 、 fgetc() 、 fgets() 。与 printf() 对应,在 C 库函数中同样也提供了格式化输入函数 scanf()。与 scanf() 一样, gets() 、 getchar() 、 fgetc() 、 fgets() 这些函数也是标准 I/O 函数,属于标准 C 库函数。
gets 函数
gets() 函数用于从标准输入设备(譬如键盘)中获取用户输入的字符串, gets() 函数原型如下:
#include <stdio.h>
char *gets(char *s);
函数参数和返回值解释如下:
s : 指向字符数组的指针,用于存储字符串。
返回值: 如果成功,该函数返回指向 s 的指针;如果发生错误或者到达末尾时还未读取任何字符,则返回 NULL 。
用户从键盘输入的字符串数据首先会存放在一个输入缓冲区中, gets() 函数会从输入缓冲区中读取字符串存储到字符指针变量 s 所指向的内存空间,当从输入缓冲区中读走字符后,相应的字符便不存在于缓冲区了。
输入的字符串中就算是有空格也可以直接输入,字符串输入完成之后按回车即可, gets() 函数不检查缓冲区溢出。
getchar 函数
getchar() 函数用于从标准输入设备中读取一个字符(一个无符号字符),函数原型如下:
#include <stdio.h>
int getchar(void);
函数参数和返回值解释如下:
无需传参 。
返回值: 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF 。
同样 getchar() 函数也是从输入缓冲区读取字符数据,但只读取一个字符,包括空格、 TAB 制表符、换行回车符等。
fgets 函数
fgets() 与 gets() 一样用于获取输入的字符串, fgets() 函数原型如下:
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
函数参数和返回值解释如下:
s : 指向字符数组的指针,用于存储字符串。
size : 这是要读取的最大字符数。
stream : 文件指针。
fgetc 函数
fgetc() 与 getchar() 一样,用于读取一个输入字符,函数原型如下:
#include <stdio.h>
int fgetc(FILE *stream);
函数参数和返回值解释如下:
stream : 文件指针。
返回值: 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF 。
fgetc() 与 getchar() 的区别在于, fgetc 可以指定输入字符的文件,既可以从标准输入设备输入字符,也可以从一个普通文件中输入字符,其它方面与 getchar 函数相同。
2.字符串长度
C 语言函数库中提供了一个用于计算字符串长度的函数 strlen() ,其函数原型如下:
#include <string.h>
size_t strlen(const char *s);
函数参数和返回值含义如下:
s : 需要进行长度计算的字符串,字符串必须包含结束字符 ' \0 ' 。
返回值: 返回字符串长度(以字节为单位),字符串结束字符 ' \0 ' 不计算在内。
3. 字符串拼接
C 语言函数库中提供了 strcat()函数或 strncat() 函数用于将两个字符串连接(拼接)起来, strcat 函数原型如下:
#include <string.h>
char *strcat(char *dest, const char *src);
函数参数和返回值含义如下:
dest : 目标字符串。
src : 源字符串。
返回值: 返回指向目标字符串 dest 的指针。
strcat() 函数会把 src 所指向的字符串追加到 dest 所指向的字符串末尾,所以必须要保证 dest 有足够的存储空间来容纳两个字符串,否则会导致溢出错误;dest 末尾的 ' \0 ' 结束字符会被覆盖, src 末尾的结束字符 '\0'会一起被复制过去,最终的字符串只有一个 ' \0 ' 。
strncat 函数
strncat() 与 strcat() 的区别在于, strncat 可以指定源字符串追加到目标字符串的字符数量, strncat 函数原型如下:
#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
函数参数和返回值含义如下:
dest : 目标字符串。
src : 源字符串。
n : 要追加的最大字符数。
返回值: 返回指向目标字符串 dest 的指针。
如果源字符串 src 包含 n 个或更多个字符,则 strncat() 将 n+1 个字节追加到 dest 目标字符串( src 中的 n个字符加上结束字符' \0 ' )。
4. 字符串拷贝
C 语言函数库中提供了 strcpy()函数和 strncpy()函数用于实现字符串拷贝,strcpy 函数原型如下:
#include <string.h>
char *strcpy(char *dest, const char *src);
函数参数和返回值含义如下:
dest : 目标字符串。
src : 源字符串。
返回值: 返回指向目标字符串 dest 的指针。
strcpy() 会把 src (必须包含结束字符 ' \0 ' )指向的字符串复制(包括字符串结束字符 ' \0 ' )到 dest ,所以必须保证 dest 指向的内存空间足够大,能够容纳下 src 字符串,否则会导致溢出错误。
strncpy 函数
strncpy() 与 strcpy() 的区别在于, strncpy() 可以指定从源字符串 src 复制到目标字符串 dest 的字符数量,strncpy 函数原型如下:
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
函数参数和返回值解释如下:
dest : 目标字符串。
src : 源字符串。
n : 从 src 中复制的最大字符数。
返回值: 返回指向目标字符串 dest 的指针。
把 src 所指向的字符串复制到 dest ,最多复制 n 个字符。当 n 小于或等于 src 字符串长度(不包括结束字符的长度)时,则复制过去的字符串中没有包含结束字符' \0 ' ;当 n 大于 src 字符串长度时,则会将 src 字符串的结束字符' \0 '也一并拷贝过去,必须保证 dest 指向的内存空间足够大,能够容纳下拷贝过来的字符串,否则会导致溢出错误。
5. 内存填充
在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0 。
memset 函数
memset() 函数用于将某一块内存的数据全部设置为指定的值,其函数原型如下:
#include <string.h>
void *memset(void *s, int c, size_t n);
函数参数和返回值解释如下:
s : 需要进行数据填充的内存空间起始地址。
c : 要被设置的值,该值以 int 类型传递。
n : 填充的字节数。
返回值: 返回指向内存空间 s 的指针。
参数 c 虽然是以 int 类型传递,但 memset() 函数在填充内存块时是使用该值的无符号字符形式,也就是函数内部会将该值转换为 unsigned char 类型的数据,以字节为单位进行数据填充。
bzero 函数
bzero() 函数用于将一段内存空间中的数据全部设置为 0 ,函数原型如下:
#include <strings.h>
void bzero(void *s, size_t n);
函数参数和返回值解释如下:
s : 内存空间的起始地址。
n : 填充的字节数。
返回值: 无返回值。
6. 字符串比较
C 语言函数库提供了用于字符串比较的函数 strcmp()和 strncmp(),strcmp()函数原型如下:
#include <string.h>
int strcmp(const char *s1, const char *s2);
函数参数和返回值解释如下:
s1 : 进行比较的字符串 1 。
s2 : 进行比较的字符串 2 。
返回值:
如果返回值小于 0 ,则表示 str1 小于 str2
如果返回值大于 0 ,则表示 str1 大于 str2
如果返回值等于 0,则表示字符串 str1 等于字符串 str2
strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值, strcmp 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ' )。
strncmp 函数
strncmp() 与 strcmp() 函数一样,也用于对字符串进行比较操作,但最多比较前 n 个字符, strncmp() 函数原型如下:
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
函数参数和返回值解释如下:
s1 : 参与比较的第一个字符串。
s2 : 参与比较的第二个字符串。
n : 最多比较前 n 个字符。
返回值: 返回值含义与 strcmp() 函数相同。
7. 字符串查找
C 语言函数库中也提供了一些用于字符串查找的函数,包括 strchr()、strrchr()、strstr()、strpbrk()、index()以及 rindex()等。
strchr 函数
使用 strchr() 函数可以查找到给定字符串当中的某一个字符,函数原型如下:
#include <string.h>
char *strchr(const char *s, int c);
函数参数和返回值含义如下:
s : 给定的目标字符串。
c : 需要查找的字符。
返回值: 返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c ,则返回 NULL 。
字符串结束字符 ' \0 ' 也将作为字符串的一部分,因此,如果将参数 c 指定为 ' \0 ' ,则函数将返回指向结束字符的指针。strchr 函数在字符串 s 中从前到后(或者称为从左到右)查找字符 c ,找到字符 c 第一次出现的位置就返回,返回值指向这个位置,如果找不到字符 c 就返回 NULL 。
strrchr 函数
strrchr() 与 strchr() 函数一样,它同样表示在字符串中查找某一个字符,返回字符第一次在字符串中出现的位置,如果没找到该字符,则返回值 NULL ,但两者唯一不同的是, strrchr() 函数在字符串中是从后到前(或者称为从右向左)查找字符,找到字符第一次出现的位置就返回,返回值指向这个位置,strrchr() 函数原型如下:
#include <string.h>
char *strrchr(const char *s, int c);
函数参数和返回值含义与 strchr() 函数相同。
strstr 函数
与 strchr() 函数不同的是, strstr() 可在给定的字符串 haystack 中查找第一次出现子字符串 needle 的位置,不包含结束字符' \0 ' ,函数原型如下:
#include <string.h>
char *strstr(const char *haystack, const char *needle);
函数参数和返回值含义如下:
haystack : 目标字符串。
needle : 需要查找的子字符串。
返回值: 如果目标字符串 haystack 中包含了子字符串 needle ,则返回该字符串首次出现的位置;如果未能找到子字符串 needle ,则返回 NULL 。
上面的都是比较常见的,其他大家感兴趣可以单独再去查阅。
不断学习中,共勉!!!