字符串处理函数
四个函数里面都是放字符串的。
1.1strcpy函数 string copy
调用格式:
strcpy(左串,右串)
作用:
将右边字符串(字符串常量或字符数组名)复制给左边字符串(字符数组名)
返回值:
赋值后的左串的首地址 。
注意:
(1)左串必须是字符数组名,右串可以是字符数组名或字符串常量。
(2)左串必须有足够的空间,能容纳右串。(左串 ≥ 右串的有效长度)
(3)复制时遇到右串中的' \0 ','\0及后续的字符就不复制了'。
实例:
//字符串处理函数 - strcpy函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str1[] = "abcde"; //等价于char str1[6] = {"abcde"};或char str1[] = "abcde";
//如果[]里不写,默认字节数为6 ,并且字节数不会随着下面的复制操作改变。
char str2[] = "abc";
/* strcpy(左串,右串)
* 作用:把右串全部字符(包括\0)赋值给左串
* 返回值:赋值后左串的首地址
* 原理:此函数能把整个str2复制到str1的原理是str2末尾有\0,当复制的过程中遇到\0会终止复制。 (猜测)
*/
//1.右串可以是字符数组名,也可以是字符串常量
printf("%s\n",strcpy(str1,str2));
printf("%s\n\n",strcpy(str1,"defgh"));
//左串必须是字符数组名,不可以是字符串常量。
// printf("%s\n",strcpy("abc",str1));
//DEVC++ 异常显示(让输入一个字符,输完后直接结束程序了);菜鸟编译报错 : \
warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] \
ISO c++禁止将字符串常量转换为'char*' [-Wwrite-strings]
//2.左串必须有足够的的空间,可以容纳右串。
printf("%s\n",strcpy(str1,"defghi"));
printf("复制超过初始化时字节数的字符串后的字节数为:%d\n\n",sizeof(str1)); //6
//DEV C++没报错,甚至输出了右串;菜鸟编译通过了但给了警告 :\
warning: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' \
writing 7 bytes into a region of size 6 overflows the destination [-Wstringop-overflow=] \
将7个字节写入一个6大小的区域会溢出目标
//3.复制时若遇到右串中的'\0'就终止复制
printf("%s\t%d\n",strcpy(str1,"a\0bcd"),strlen(str1));
printf("%s\t%d\n",strcpy(str1,"ab\0cd"),strlen(str1));
printf("%d\n",strlen(str1));
system("pause");
}
【运行结果】
abc
defgh
defghi
复制超过初始化时字节数的字符串后的字节数为:6
a 6
ab 1
2
1.2 strncpy函数
调用格式:
strncpy(左串,右串,n); //n为有效长度
作用:
将右串(字符串常量或字符数组名)的前n个字符赋值给左串(字符数组名),左串其余字符保持原样。若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。如果 右串 中少于 n 个字符,则用'\0'填充
返回值:
同上
实例:
//字符串处理函数 - strncpy函数
#include<stdio.h>
#include<string.h>
/* strncpy(左串,右串,n); //n为有效长度
* 作用:将右串的前n个字符赋值给左串,左串其余字符保持原样。若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。
* 返回值:复制后左串的首地址
*/
int main()
{
char str1[] = {"abcde"};
char str2[] = {"HIJKLMN"};
char str3[] = {"A\0BCDE"}; //\0 作为字符串的结束标志
printf("1.字节数为:%d,%d\n",sizeof(str1),sizeof(str2)); //6,8
printf("2.%s\n",strncpy(str1,str2,3)); //HIJde
printf("3.字节数为:%d,%d\n",sizeof(str1),sizeof(str2)); //6,8
printf("4.%s\n",strncpy(str2,str1,4)); //HIJdLMN
//执行此语句之前,str1的值已经变为了:HIJde
printf("5.%s\n",strncpy(str2,str1,7)); //HIJde
//若下标越界(str1一共5个有效长度,我们却让他赋值7个有效长度字符),C语言编译器没有报错,在线编译器在n==14之前没报错,14之后报错了
printf("6.字节数为:%d,%d\n",sizeof(str1),sizeof(str2)); //6,8
strcpy(str1,"asdasdasdassdasd"); //右串有16个字母。
printf("7.字节数为:%d,%d\n",sizeof(str1),strlen(str1)); //6,16
//求长度不受字节数的限制,即使内存溢出了 (如本题字节数为6,但长度却可以为16)
//字符串的字节数也不受长字符串复制给它的影响,以定义、初始化时的字节数作为字节数(如 \
本题给它赋值了个16字符长度的串,但左串的字节数始终为6)。
//若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。
printf("8.%s\n",strcpy(str1,str3)); //A
//本题的右串有效长度为1,所以只把右串的前1个字符复制给了左串,左串其余字符不变。
printf("9.字符串str3的输出结果为:%s,有效长度为:%d,字节数为:%d\n",str3,strlen(str3),sizeof(str3));//A,1,7
//由于右串的有效长度为1,所以输出结果也只输出\0前的字符,有效长度也只计算\0前的长度,而字节数不受\0限制。
}
【运行结果】
1.字节数为:6,8
2.HIJde
3.字节数为:6,8
4.HIJdLMN
5.HIJde
6.字节数为:6,8
7.字节数为:6,16
8.A
9.字符串str3的输出结果为:A,有效长度为:1,字节数为:7
2.strcat函数 string concatenate
将右边字符串连接到左边字符串的末尾(覆盖掉左串的'\0')。
注意:
(1)左串必须是字符数组名,右串可以是字符数组名或字符串常量。
(2)左边字符串的数组大小要 >= 当前左字符串大小+右字符串-1(编译器对于此项不太严格,DEV C++直接不检测该项也可以输出)如下面的两张图
(3)右串的首字符会覆盖掉左串的结束标志'\0'
char a[] = "he\0llo," , b[] = "how are you!";
printf("%s",strcat(a,b)); //hehow are you!
(菜鸟在线)
(DEV C++)
3.strcmp函数 string compare
左串与右串作比较:
比较方法:从首字母起,依次比较ASCLL码值。直到'\0'结束。如果所有字符都相同,返回0,否则返回>0或<0
strcmp函数可以比较两个数组、两个字符串常量、或比较数组和字符串常量。
左串 右串 |
返回值 |
> |
正数 |
< |
负数 |
== |
0 |
K&R 2 与 C11标准中,返回值是返回一个正数、负数、0。关于具体的数值没有做具体规定(由编译器自己决定)
不同编译器具体实现的效果可不同,在DEV C++和VS2019是返回1、-1、0,在线编译器中是返回左串-右串的值
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "abc", b[] = "abc", c[] = "a\0bc";
printf("%d\n", strcmp(a, b)); //0 注意这是判断大小,不是判断是否相等
printf("%d\n", strcmp(a, c)); //VS2019、DEV C++:1 菜鸟:98
printf("%d\n", strcmp("ab\0c","abc")); //-1
return 0;
}
注:对字符串的比较不能用 == ,对字符的比较可以用 ==
4.strlen函数 string length
可以测字符串常量的长度:
printf("%d", strlen("abc")); //3
printf("%d", strlen("ab\0c")); //2
求串的有效长度,只测\0之前的字符数量。
strlen与sizeof的区别:数组
5.strlwr(串) string lowercase
大写转为小写
6.strupr(串) string uppercase
小写转为大写
- 点赞
- 收藏
- 关注作者
评论(0)