注意这里提到的字符串函数都需要如下这个头文件声明:
#include
一、计算字符串的长度
strlen(char*)函数求的是字符串的实际长度,如下面代码输出结果是“5”
#include
#include
int main()
{
char name[]="China";
int len;
len = strlen(name); //计算字符串name的长度
printf("字符串长度:%d\n",strlen(name));
return 0;
}
区别sizeof
sizeof不是函数,仅仅是一个取字节运算符,sizeof可以用数据类型做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。
二、字符串拷贝strcpy
#include
#include
int main()
{
//1、字符串拷贝
char str1[16]="China";
char str2[16]="Shanghai";
strcpy(str1,str2); //strcpy的第一个参数是目标,第二个参数是源字符串
printf("str1:%s\nstr2:%s\n",str1,str2);
return 0;
}
代码打印结果是str1 = "Shanghai" str2 = "Shanghai"
如果是如下代码,打印结果又是怎样的呢?
char str1[16]="123456789";
char str2[16]="China";
strcpy(str1,str2);
结果是:China 为什么不是 China6789 或者 China789 呢?
因为strcpy函数会把源字符串的“字符串结束符”也一同拷贝到目的字符串中:
str1内存里面存储的是:'C' 'h' 'i' 'n' 'a' 0 '7' '8' '9' (这里的0是数字0 不是字符'0')
使用printf函数打印char字符串%s时遇到“字符串结束符” 0 就停止打印了,其实str1里面还是有后面那些内容的
strcpy的特点:
把源字符串的“字符串结束符”也一同拷贝到目的字符串中,语法简单,非常方便。
strcpy的缺点:
可能导致字符串越界!不安全
char str1[8]="China";
char str2[32]="Shanghai nanjing lu";
strcpy(str1,str2);
如上面的代码,str2 拷贝到 str1 明显超出了str1定义的字符串长度,越界了,但是程序还是能执行拷贝,这个要非常注意!
三、字符串拷贝strncpy
strncpy的作用就是:拷贝指定个数的字符到指定的字符串里面
#include
#include
int main()
{
char str1[8]="1234567";
char str2[16]="China";
strncpy(str1,str2,3); //strncpy的第三个参数就是拷贝的个数
printf("str1:%s\nstr2:%s\n",str1,str2);
return 0;
}
str1输出的结果是 Chi4567 因为是截断后拷贝,所以是不把“字符串结束符”一同拷贝的
如果上面 strncpy(str1,str2,3); 函数中的3改为6,这样拷贝就会带上“字符串结束符”一同拷贝,打印的结果就会是 China
还要注意一种情况:
char str1[8]="1234567";
char str2[16]="eet";
strncpy(str1,str2,5); //str2里面的字符不够5个
打印结果是 eet (因为用 printf 打印 %s 遇到“字符串结束符” 停止了 )
所以str1里面的内容是 'e' 'e' 't' 0 0 '6' '7' 并不是 'e' 'e' ' t' '4' '5' '6' '7'
可以通过
printf("%c%c%c%d%d%c%c",str1[0],str1[1],str1[2],str1[3],str1[4],str1[5],str1[6]);
打印验证 str1里面的内容。
所以当strncpy的第3个参数,大于拷贝源(第二个参数)的长度+1时,(上题中的 5 > 3 + 1)则把不足部分用0填充!
四、字符串连接strcat
#include
#include
int main()
{
char dest1[64];
char dest2[64];
printf("请输入您的省份:");
gets(dest1);
printf("请输入您的城市:");
gets(dest2);
strcat(dest1,dest2); //第二个字符串拼接到第一个字符串的尾部
printf("dest1:%s\ndest2:%s\n",dest1,dest2);
return 0;
}
效果如下:
dest2 的 "苏州" 0 拼接到了 dest1 的尾部,同时覆盖了dest1 的 末尾结束符 0 变成:"江苏苏州" 0