C语言字符串操作----strlen()、strcpy()、strcat()、strcmp()

C语言中并没有没有显示的字符串数据类型,因此字符串以字符串常量的形式或者存储于字符数组中。字符串常量很适合用于那些程序不会对它们进行修改的字符串,所有其他字符串必须存储于字符数组或动态分配的内存中。注意:字符串是以一个位模式为全0的NUL字节结尾,因此,字符串所包含的字符内部不能出现NUL字节。

C语言中 头文件string.h包含使用字符串函数所需的原型和声明。尽管并非必需,但在程序中包含头文件确实是个好主意,因为有了它包含的原型,编译器可以更好地为你的程序执行错误检查。

1、字符串长度 strlen()

库函数strlen的原型:     size_t   strlen(char const *string);

注意:size_t是一个无符号整数类型,在表达式中使用无符号整数类型可能导致不可预料的结果。

例如下面两个表达式看上去是相等的:

if( strlen(x) >= strlen(y)) ......
if( strlen(x) - strlen(y) >=0)......
但是事实上它们是不相等的。第一条语句将按照你的设想工作,但第2条语句的结果将永远是真。strlen()的结果是一个无符号数,所以操作符>=左边的表达式也将是无符号的,而无符号的数绝不可能是负。


2、字符串复制

长度不受限制的库函数strcpy的原型:     char   *strcpy(char *dst, char const *scr);

这个函数把参数scr字符串复制到dst参数。scr和dst在内存中不能出现重叠,否则其结构是未定义的。由于dst参数将进行修改,所以它必须是个字符串数组或者一个指向动态分配内存的数组指针,不能使用字符串常量。

字符串复制到数组后将以NUL字节结尾,当字符串比数组短时,数组中的老字符串最后剩余的几个字符将被删除。

char  dst[50] = "hello";
strcpy(dst,"world");

注意:复制时目标字符数组的空间要足以容纳所需复制的字符串。如果字符串比数组长,多余的字符仍被复制,它将覆盖原先存储于数组后面的内存空间的值,这样改写了原先恰好存储在那里的变量。


长度受限的字符串复制函数strncpy原型:   char   *strncpy(char *dst, char const *scr,size_t len);

与长度不受限的区别是,strncpy总是正好向dst写入len个字符。如果strlen(scr)<len,dst数组就用额外的NUL字节填充到len长度。如果strlen(scr)>=len 那么只有len个字符被复制到dst中。注意:它的结果将不以NUL字节结尾。


3、字符串链接

长度不受限: char  *strcat(char *dst, char const *scr);

strcat要求dst参数原先已经包含了一个字符串(可以是空字符串),它找到这个字符串的末尾,把scr的一份拷贝添加到这个位置。注意:dst要保证剩余的空间可以保存整个scr。

strcat(dst,"world");

长度受限:char  *strncat(char *dst, char const *scr,size_t len);

strncat总在结果字符串后面添加一个NUL字,并且它不会像strncpy那样进行填充。


4、字符串比较

字符串比较采用“词典比较”;

长度不受限 strcmp: int   strcmp(char const *s1, char const *s2);

s1小于s2返回小于0的值,相等返回0,s1大于s2但会大于0的值;注意大于0与小于0的值不总是1和-1。

长度受限 strncmp: int   strcmp(char const *s1, char const *s2,size_t len);

strncmp最多比较len个字节,如果两个字符串在第len个字符之前存在不相等的字符,就像strcmp一样停止比较,返回结构,如果前len个都相等,函数就返回0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值