目录
一、字符串的概念
我们可以把字符串储存在char类型的数组中,如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串
因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节用来存放\0,\0就是数字0
例如
char name[21]; // 定义一个最多存放20个英文字符或十个中文的字符串
- 字符串也可以存放中文和全角的标点符号,一个中文字符占两个字节(GBK编码)。char strname[21]用于存放中文的时候,最多只能存10个汉字。
- 字符串采用双引号包含起来,如:"hello,world"、"你好C语言"
二、占用内存的情况
一个字符占用一字节的内存,字符串定义时数组的大小就是字符串占用内存的大小
char str[21]; // 占用21字节的内存
char str[1024]; // 占用1024字节的内存
三、字符串的初始化
char name[21];
memset(name,0,sizeof(name));//采用memset函数初始化字符串
四、字符串与指针
char name[21];
memset(name,0,sizeof(name));
strcpy(name,"hello,xiaoqiu");//把hello,xiaoqiu赋值给name
printf("%s\n",name);
五、字符串的结尾标志
- 字符串的结尾标志是0,如果没有结尾标志,后面的内容将被丢弃
- 结尾标志后面的内容如何处理
#include <stdio.h>
#include <string.h>
int main()
{
char name[21];
memset(name,0,sizeof(name));
strcpy(name,"hello,xiaoqiu");//把hello,xiaoqiu赋值给name
name[5]=0;//强制把第6个元素赋值为0
printf("%s\n",name);
return 0;
}
运行效果
以上代码输出的结果是 hello ,但是,在内存中的值仍是hello0xiaoqiu,后面的 xiaoqiu 成了内存中的垃圾值
不要让字符串的内存中有垃圾值,容易产生意外的后果。这就是字符串的初始化不建议采用把第一个元素的值置为0的原因(name[0]=0)
六、字符串常用的库函数
1、获取字符串的长度(strlen)
size_t strlen( const char* str);
- 功能:计算字符串的有效长度,不包含 \0
- 返回值:返回字符串的字符数
- strlen 函数计算的是字符串的实际长度,遇到第一个\0结束
- 函数返回值一定是size_t,是无符号的整数,即typedef unsigned int size_t
- 如果您只定义字符串没有初始化,求它的长度是没意义的,它会从首地址一直找下去,遇到0停止
- 很多人对 sizeof 和 strlen 有点分不清楚 。sizeof 返回的是变量所占的内存数,不是实际内容的长度
举个例子
#include <stdio.h>
#include <string.h>
int main()
{
char name[21];
memset(name,0,sizeof(0));
strcpy(name,"xiaoqiu");
printf("strlen=%d\n",strlen(name)); // 7
printf("sizeof=%d\n",sizeof(name)); // 21 sizeof 返回的是变量所占的内存数
return 0;
}
运行效果
自己实现一个 strlen 函数
#include <stdio.h>
#include <string.h>
int mystrlen(const char* str)
{
int i = 0;
while( str[i]!='\0' ) {
i++;
}
return i;
}
int main()
{
char name1[21];
memset(name1,0,sizeof(0));
strcpy(name1,"xiaoqiu");
char name2[21];
memset(name2,0,sizeof(0));
strcpy(name2,"baidu");
printf("mystrlen=%d\n",mystrlen(name1)); // 7
printf("mystrlen=%d\n",mystrlen(name2)); // 5
return 0;
}