Linux C应用编程:字符串处理函数

1 字符串输出

常用的字符串输出函数有 putchar()、puts()、fputc()、fputs(),)这些函数只能输出字符串。

而printf()可以按照自己规定的 格式输出字符串信息,一般称为格式化输出。

1.1  puts 函数

puts()函数用来向标准输出设备(屏幕、显示器)输出字符串并自行换行。把字符串输出到标准输出设 备,将' \0 '转换为换行符' \n '。

#include <stdio.h>

int puts(const char *s);
  • s:需要进行输出的字符串。
  • 返回值:成功返回一个非负数;失败将返回 EOF,EOF 其实就是-1。

 使用 puts()函数连换行符' \n '都省了,函数内部会自动在其后添加一个换行符。

1.2  fputs 函数

 fputs()与 puts()类似,也用于输出一条字符串,与 puts()区别在于,puts()只能输出到标准输出设 备,而 fputs()可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。

#include <stdio.h>

int fputs(const char *s, FILE *stream);
  • s:需要输出的字符串。
  • stream:文件指针。
  • 返回值:成功返回非负数;失败将返回 EOF。

 1.3 putchar 函数

putchar()函数可以把参数 c 指定的字符(一个无符号字符)输出到标准输出设备,其输出可以是一个字符,可以是介于 0~127 之间的一个十进制整型数(包含 0 和 127,输出其对应的 ASCII 码字符),也可以是 用 char 类型定义好的一个字符型变量。

#include <stdio.h>

int putchar(int c);

1.4 fputc 函数

fputc()与 putchar()类似,也用于输出参数 c 指定的字符(一个无符号字符),与 putchar()区别在于, putchar()只能输出到标准输出设备,而 fputc()可把字符输出到指定的文件中,既可以是标准输出、标准错误 设备,也可以是一个普通文件。

#include <stdio.h>

int fputc(int c, FILE *stream);
  • c:需要进行输出的字符。
  • stream:文件指针。
  • 返回值:成功时返回输出的字符;出错将返回 EOF。

2 字符串输入

常用的字符串输入函数有 gets()、getchar()、fgetc()、fgets()。

C 库函数中提供 了格式化输入函数 scanf()。

2.1 gets 函数

gets()函数用于从标准输入设备(譬如键盘)中获取用户输入的字符串

#include <stdio.h>

char *gets(char *s);
  • s:指向字符数组的指针,用于存储字符串。
  • 返回值:如果成功,该函数返回指向 s 的指针;如果发生错误或者到达末尾时还未读取任何字符,则返 回 NULL。
  1.  用户从键盘输入的字符串数据首先会存放在一个输入缓冲区中,gets()函数会从输入缓冲区中读取字符 串存储到字符指针变量 s 所指向的内存空间,当从输入缓冲区中读走字符后,相应的字符便不存在于缓冲区了。
  2. 输入的字符串中就算是有空格也可以直接输入,字符串输入完成之后按回车即可,gets()函数不检查缓冲区溢出。

2.2 getchar 函数

 getchar()函数用于从标准输入设备中读取一个字符(一个无符号字符)

#include <stdio.h>

int getchar(void);
  • 无需传参。
  • 返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错 误,则返回 EOF。

 2.3 fgets 函数

fgets()与 gets()一样用于获取输入的字符串,而 fgets()既可以从标准输入设备获取字符串、也可 以从一个普通文件中获取输入字符串。

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);
  • s:指向字符数组的指针,用于存储字符串。
  • size:这是要读取的最大字符数。
  • stream:文件指针。

 2.4 fgetc 函数

fgetc()与 getchar()一样,用于读取一个输入字符,fgetc()与 getchar()的区别在于,fgetc 可以指定输入字符的文件,既可以从标准输入设备输入字符,也可 以从一个普通文件中输入字符,其它方面与 getchar 函数相同。函数原型如下所示:

#include <stdio.h>

int fgetc(FILE *stream);
  • stream:文件指针
  • 返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错 误,则返回 EOF

 3 字符串函数

 3.1 字符串长度:strlen()

C 语言函数库中提供了一个用于计算字符串长度的函数 strlen()

#include <string.h>

size_t strlen(const char *s);
  • s:需要进行长度计算的字符串,字符串必须包含结束字符' \0 '。
  • 返回值:返回字符串长度(以字节为单位),字符串结束字符' \0 '不计算在内。

 3.2 字符串拼接:strcat()或 strncat()

3.2.1 strcat函数

strcat 将两个字符串连接(拼接)起来,strcat 函数原型如下所示:

#include <string.h>

char *strcat(char *dest, const char *src);
  •  dest:目标字符串。
  • src:源字符串。
  • 返回值:返回指向目标字符串 dest 的指针。

 strcat()函数会把 src 所指向的字符串追加到 dest 所指向的字符串末尾,所以必须要保证 dest 有足够的存 储空间来容纳两个字符串,否则会导致溢出错误;dest 末尾的' \0 '结束字符会被覆盖,src 末尾的结束字符' \0 '会一起被复制过去,最终的字符串只有一个' \0 '。

3.2.2 strncat 函数

strncat()与 strcat()的区别在于,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 ')。

 3.3 字符串拷贝

 3.3.1 strcpy()函数

 strcpy()将字符串 src 复制到目标字符串 dest ,覆盖原数据,strcpy 函数原型如下所示:

#include <string.h>

char *strcpy(char *dest, const char *src);
  • dest:目标字符串。
  • src:源字符串。
  • 返回值:返回指向目标字符串 dest 的指针。

strcpy()会把 src(必须包含结束字符' \0 ')指向的字符串复制(包括字符串结束字符' \0 ')到 dest,所以 必须保证 dest 指向的内存空间足够大,能够容纳下 src 字符串,否则会导致溢出错误。

3.3.2 strncpy 函数

 strncpy()可以指定从源字符串 src 复制到目标字符串 dest 的字符数量,覆盖原数据

#include <string.h>

char *strncpy(char *dest, const char *src, size_t n);
  • dest:目标字符串。
  • src:源字符串。
  • n:从 src 中复制的最大字符数。
  • 返回值:返回指向目标字符串 dest 的指针。

 当 n 小于或等于 src 字符串长度(不包括结束 字符的长度)时,则复制过去的字符串中没有包含结束字符' \0 ';当 n 大于 src 字符串长度时,则会将 src 字符串的结束字符' \0 '也一并拷贝过去,必须保证 dest 指向的内存空间足够大,能够容纳下拷贝过来的字符 串,否则会导致溢出错误。

 3.4 字符串内存填充

 将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变 量时,通常需要对其进行初始化操作

3.4.1 memset 函数

memset()函数用于将某一块内存的数据全部设置为指定的值,其函数原型如下所示:

#include <string.h>

void *memset(void *s, int c, size_t n);
  • s:需要进行数据填充的内存空间起始地址。
  • c:要被设置的值,该值以 int 类型传递。
  • n:填充的字节数。
  • 返回值:返回指向内存空间 s 的指针。

 3.4.2 bzero 函数

于将一段内存空间中的数据全部设置为 0

#include <strings.h>

void bzero(void *s, size_t n);
  • s:内存空间的起始地址。
  • n:填充的字节数。
  • 返回值:无返回值。

 3.5 字符串比较

3.5.1 strcmp()函数

C 语言函数库提供了用于字符串比较的函数,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

3.5.2  strncmp 函数

strncmp()与 strcmp()函数一样,也用于对字符串进行比较操作,但最多比较前 n 个字符

#include <string.h>

int strncmp(const char *s1, const char *s2, size_t n);
  •  s1:参与比较的第一个字符串。
  • s2:参与比较的第二个字符串。
  • n:最多比较前 n 个字符。
  • 返回值:返回值含义与 strcmp()函数相同。

3.6 字符串查找

如从一个给定的字符串当中查找某一个字符 或者一个字符串,并获取它的位置。

3.6.1 strchr 函数

使用 strchr()函数可以查找到给定字符串当中的某一个字符,如果将参数 c 指定为' \0 ',则函数将返回指向结束字符的指针。

#include <string.h>

char *strchr(const char *s, int c);
  • s:给定的目标字符串。
  • c:需要查找的字符。
  • 返回值:返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。

 3.6.2 strrchr 函数

strrchr()与 strchr()函数一样,它同样表示在字符串中查找某一个字符,但两者唯一不同的是,strrchr()函数在字符串中是从后到前 (或者称为从右向左)查找字符,找到字符第一次出现的位置就返回,返回值指向这个位置。

#include <string.h>

char *strrchr(const char *s, int c);
  • s:给定的目标字符串。
  • c:需要查找的字符。
  • 返回值:返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。

 3.6.3 strstr 函数

在给定的字符串 haystack 中查找第一次出现子字符串 needle 的位置, 不包含结束字符' \0 '

#include <string.h>

char *strstr(const char *haystack, const char *needle);
  • haystack:目标字符串。
  • needle:需要查找的子字符串。
  • 返回值:如果目标字符串 haystack 中包含了子字符串 needle,则返回该字符串首次出现的位置;如果未 能找到子字符串 needle,则返回 NULL。

3.7  字符串与数字相互转换

将数字组成的字符串转换为相应的数字、或者将数字转换为字符串

3.7.1 字符串转整形数据

现将一个字符串转为整形数据,主要包括 atoi()、atol()、atoll()以及 strtol()、strtoll()、strtoul()、strtoull()等,它们之间的区别主要包括以下两个方面:

  • 数据类型(int、long int、unsigned long 等)。
  • 不同进制方式表示的数字字符串(八进制、十六进制、十进制)。
3.7.1.1 atoi、atol、atoll 函数

 atoi()、atol()、atoll()三个函数可用于将字符串分别转换为 int、long int 以及 long long 类型的数据,它们 的函数原型如下:

#include <stdlib.h>

int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
  • nptr:需要进行转换的字符串。
  • 返回值:分别返回转换之后得到的 int 类型数据、long int 类型数据以及 long long 类型数据。

 使用 atoi()、atol()、atoll()函数只能转换十进制表示的数字字符串,即 0~9。

3.7.1.2 strtol、strtoll 函数

 strtol()、strtoll()可以实现将多种不同进制数(譬如二进制表示的数字字符串、八进制 表示的数字字符串、十六进制表示的数数字符串)表示的字符串转换为整形数据

#include <stdlib.h>

long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);

nptr:需要进行转换的目标字符串。

endptr:char **类型的指针,如果 endptr 不为 NULL,则 strtol()或 strtoll()会将字符串中第一个无效字 符的地址存储在*endptr 中。如果根本没有数字,strtol()或 strtoll()会将 nptr 的原始值存储在*endptr 中(并返 回 0)。也可将参数 endptr 设置为 NULL,表示不接收相应信息。

base:数字基数,参数 base 必须介于 2 和 36(包含)之间,或者是特殊值 0。参数 base 决定了字符串 转换为整数时合法字符的取值范围,譬如,

  • 当 base=2 时,合法字符为' 0 '、' 1 '(表示是一个二进制表示的 数字字符串);
  • 当 base=8 时,合法字符为' 0 '、' 1 '、' 2 '、' 3 '……' 7 '(表示是一个八进制表示的数字字符 串);
  • 当 base=16 时,合法字符为' 0 ' 、' 1 '、' 2 '、' 3 '……' 9 '、' a '……' f '(表示是一个十六进制表示的数 字字符串);
  • 当 base 大于 10 的时候,' a '代表 10、' b '代表 11、' c '代表 12,依次类推,' z '代表 35(不区 分大小写)。

返回值:分别返回转换之后得到的 long int 、 long long int 、unsigned long int和unsigned long long int类型数据。

3.8 给应用程序传参

如果在执行应用程序时,需要向应用程序传递参数,譬如,main 函数的两种常用写法:

int main(int argc, char **argv)
{
    /* 代码 */
}

 或者写成如下形式:

int main(int argc, char *argv[])
{
    /* 代码 */
}

传递进来的参数以字符串的形式存在,字符串的起始地址存储在 argv 数组中,参数 argc 表示传递进来的参数个数(自动识别个数),包括应用程序自身路径名,多个不同的参数之间使用空格分隔开来,如果参数本身带有空格、 则可以使用双引号" "或者单引号' '的形式来表示。

 4 正则表达式

正则表达式,又称为规则表达式(英语: Regular Expression),正则表达式通常被用来检索、替换那些 符合某个模式(规则)的字符串,正则表达式描述了一种字符串的匹配模式(pattern),可以用来检查一个 给定的字符串中是否含有某种子字符串、将匹配的字符串替换或者从某个字符串中取出符合某个条件的子 字符串。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值