C语言整理#2:常用字符串函数

c中常用字符串函数整理。


一、概述

字符串是C语言中最重要的数据类型之一。字符串是以空字符(\0)结尾的一系列char型数组,无论是由字符数组、指针还是字符串常量标识,都存储为包含字符编码的一系列字节,并以空字符结尾。

C提供了许多专门用于处理字符串的函数。值得注意的是,函数使用指向字符串首字符的指针表示待处理的字符串。参数传递的都是首字符的地址,一般而言没有必要传递字符串的长度,函数可以通过末尾的空字符确定字符串的结束。

二、常用字符串函数总结

ANSIC 库有20多个用于处理字符串的函数,下面总结了一些常用的函数:

(1)字符串复制

char *strcpy (char *restrict s1, const char *restrict s2);

该函数把 s2指向的字符串(包括空字符)拷贝至s1 指向的位置,返回值是 s1。


char *strncpy (char *restrict s1, const char *restrict s2, size_t n);

相比于strcpy多一个参数,该函数把 s2指向的字符串拷贝至s1 指向的位置,拷贝的字符数不超过n,其返回值是s1。请注意该函数不会拷贝空字符后面的字符,如果源字符串的字符少于n个,目标字符串就以拷贝的空字符结尾;如果源字符串有n个或超过n个字符,就不拷贝空字符。


char *strdup (const char *str);

该函数将字符串复制到新建立的空间,首先会用malloc()配置与参数str字符串相同的空间大小,然后将参数str字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。

参数char *str  为要复制的字符串。返回值是字符串指针,该指针指向复制后的新字符串地址。若返回NULL则表示内存不足。

  • 注意:该函数不是标准库函数,只能在windows下(VC、MinGW等)使用,Linux GCC中需要自己定义。

(2)字符串拼接

char *strcat (char *restrict s1, const char *restrict s2);

该两数把s2指向的字符串拷贝至s1指向的字符串末尾。s2字符串的第一个字符将覆盖s1字符串末尾的空字符。该函数返回 s1。


char *strncat (char *restrict s1, const char *restrict s2, size_t n);

相比于strcat 多一个参数,该函数把s2字符串中的n个字符拷贝至 s1 字符串末尾。s2字符串的第一个字符将覆盖 s1字符串末尾的空字符。不会拷贝 s2 字符串中空字符和其后的字符,并在拷贝字符的末尾添加一个空字符。该函数返回s1。

(3)字符串对比

int strcmp (const char *s1, const char *s2);

该函数返回一个整数值, 

  • 如果 s1 字符串在机器排序序列中位于s2 字符串的后面,该函数返回一个正数;
  • 如果两个字符串相等,则返回 0;
  • 如果 s1 字符串在机器排序序列中位于 s2字符串的前面,则返回一个负数。

int strncmp (const char *s1, const char *s2, size_t n);

该函数的作用和 strcmp() 类似,不同的是多一个参数n,该函数在比较n个字符后或遇到第 1个空字符时停止比较。

(4)字符串查找

char *strchr (const char *s, int c);

如果查找到s字符串中包含c字符,则该函数返回指向s字符串中首次出现的c字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在s字符串中未找到c字符,该函数则返回空指针。


char *strpbrk (const char *s1, const char *s2);

如果s1字符串中包含s2字符串中的任意字符,则该函数返回指向s1字符串首位置的指针;如果在
s1字符串中未找到任何 s2 字符串中的字符,则返回空字符。


char *strrchr (const char *s, char c);

该函数返回s字符串中c字符最后一次出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到c字符,则返回空指针。


char *strstr (const char *s1, const char *s2);

该函数返回指向 s1 字符串中 s2 字符串出现的首位置的指针。如果在 s1 中没有找到 s2,则返回空指针。

(5)字符计数

size_t strlen(const char *s);

该函数返回s字符串中的字符数,不包括末尾的空字符。size_t是sizeof运算符返回的类型,c规定sizeof运算符返回一个整数类型,但是并未指定具体是哪种整数类型,需要视系统而定。

(6)字符串转换成数值

int atoi (const char *str);

该函数的返回值为int类型的整数,转换后的值不可超出int可表示的范围。

  • 该函数首先会丢弃尽可能多的空白字符,直到找到第一个非空白字符,然后,从这个字符开始,取一个可选的初识加号或者减号,后跟尽可能多的十进制数字,并将他们返回一个int类型的数值。
  • 若该字符串是在整数的字符后包含其他字符,则这些字符将会被忽略,返回其他字符之前的整数,并且不会对该函数造成任何影响。
  • 若该字符串中第一个非空字符序列表示有效的整数,或是一个空指针,或只包含空白字符,则不执行任何转换,并且返回零。

long int atol (const char *str);

atol() 函数把参数 str 所指向的字符串转换为long int 型数值。函数会先丢弃尽可能多的空白字符,找到第一个非空白字符,然后从这个字符开始,初始字符可以是 + 或者 - 号,后跟尽可能多的十进制数字,最终将它们转换成整数。参数str 为要转换的字符串。该函数返回转换后的长整数,如果没有执行有效的转换,则返回0。


double atof (const char *str);

atof() 函数用于将包含浮点数的字符串转换为相应的浮点数。函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,将后续的有效字符转换成浮点数,最后一个有效字符之后的字符串将被忽略。

参数str 用来指向要转换的字符串。函数返回转换成功后的双精度浮点数(类型为 double);如果转换失败,返回 0.0。

(7)字符串转换成数值(指定进制)

long int strtol (const char *str, char **endptr, int base);

strtol() 函数用于将字符串str转换为长整数(long int 型)。

参数列表:

  • str:指向要转换字符串的指针。
  • endptr:该指针被设置为标识输入数字结束字符的地址,是可选的输出参数,如果不为 NULL,则函数执行完后,endptr 指向下一个要转换的字符。
  • base:进制基数,范围是2 到 36,或者是特殊值 0。当 base 的值为 0 时,默认会采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。

转换过程中,strtol() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始获取尽可能多的有效字符,并将它们转换成长整数。如果 endptr 不为 NULL,且后续还有无效的字符串,则将 endptr 指向首个无效的字符。

函数返回转换成功后的long int 型数值,如果无法进行有效的转换,函数返回0。如果转换后的数值超出了 long 类型所能表示的范围,函数会返回  LONG_MAX 或者 LONG_MIN。


unsigned long int strtoul (const char *str, char **endptr, int base)

strtoul () 函数用于将字符串str转换为无符号长整数(unsigned long int 型)。

参数列表:

  • str:指向要转换字符串的指针。
  • endptr:该指针被设置为标识输入数字结束字符的地址,是可选的输出参数,如果不为 NULL,则函数执行完后,endptr 指向下一个要转换的字符。
  • base:进制基数,范围是2 到 36,或者是特殊值 0。当 base 的值为 0 时,默认会采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。

该函数与strtol() 函数非常类似。strtoul () 函数返回转换后的长整数,如果没有执行有效的转换,则返回0。

(8)字符串写入

int sprintf( char *buffer, const char *format, [ argument] … ); 

该函数把格式化的数据写入某个字符串。返回值是字符串长度(strlen)

参数列表: 

  •   buffer:char型指针,指向欲写入的字符串地址。 
  •   format:char型指针,指向的内存里面存放了格式字符串。 
  •   [argument]…:可选参数,可以是任何类型的数据。 

 int snprintf ( char *str, size_t size, const char *format, argument, ... );

该函数的主要作用是将格式化的数据(比如数字、字符串等)转换为一个字符串,并将该字符串写入到一个指定的缓冲区中,以便后续处理。与 sprintf() 不同的是,snprintf() 会限制输出的字符数,避免缓冲区buffer溢出。 

参数列表:

  • str:目标字符串,用于存储格式化后的字符串的字符数组的指针。
  • size:字符数组的大小。
  • format:格式化字符串,与printf()函数相同。
  • argument:可变参数,可变数量的参数根据 format 中的格式化指令进行格式化。

snprintf() 函数的返回值是输出到 str 缓冲区中的字符数,不包括字符串结尾的空字符 \0。如果 snprintf() 输出的字符数超过了 size 参数指定的缓冲区大小,则输出的结果会被截断,只有 size - 1 个字符被写入缓冲区,最后一个字符为字符串结尾的空字符 \0。

需要注意的是,snprintf() 函数返回的字符数的值并不包括字符串结尾的空字符 \0。

三、补充说明

请注意,那些使用 const 关键字的函数原型表明,函数不会更改字符串。例如,下面的函数原型:

char *stropy (char *restrict s1, const char *restrict s2);

表明不能更改 s2指向的字符串,至少不能在 stropy() 函数中更改。但是可以更改 s1 指向的字符串。因为s1是目标字符串,需要改变,而s2是源字符串不能更改。

使用函数需要添加相应的字符串头文件 #include <string.h>。


  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clock_926

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值