定义
- 字符数组,第一个就是数组,所以需要有大小,符号【】
- 第二个就是,存放字符的数组,由于存放的是字符
- 表示字符的前缀char
- 单个字符的表示方法 ‘a’,单引号
初始化
方式
- 单个赋值 char s[3] = {‘a’,‘b’,‘c’};//无法输出,系统无法读取\0
- char s[3]=“ab”;
- char s[]=“abcedfg” 定义初始化,一起的,单个的需要指定大小
- 需要定义初始化才可使用
- 方便,不用认为指定,系统会自动分配内存空间
- 注意如果同时存在char s[ ]="jajji"类似的和char a[2]={‘a’,‘b’},输出有问题,因为第二个找不到对应的\0,系统默认没有结束,接上面的字符串使用
- 赋值汉字–一个汉字是两个字节,故不能分开赋值,一个单引号放置一个字符,一个字符是一字节,所以只能整体赋值,不能分开赋值
如何用
就是定义与初始化,其中的注意事项需要注意一下,这是基本内容
字符串的长度求解问题
- sizeof 与 strlen的区别
- strlen 是实际长度 sizeof 是定义的所有长度,包括\0
- sizeof 无法计算动态大小的内存空间大小,因为\0也算,用strlen可以计算动态大小的存储
- strlen是一个函数,用来计算对应的str长度,size_t strlen(char const* str); 返回的类型是size_t的值(无符号类型,所以如果两个类型相同的东西相减,结果类型仍然保持不变,任然是大于0的,类似unsinged5- unsigned7 结果一定是整数,所以可以使用比较大小的方式)
1.常用字符串(下面的都是函数调用)
strlen 使用方法
size_t strlen(const char * str);
1. 是个函数,计算实际的长度,不包括\0
2. size_t strlen(const char * str); 返回值类型是sizet
3. 注意返回值类型是无符号类型,两个无符号类型的相减结果仍然是无符号类型,注意防止错误
4. 但是如果赋值给int就没有任何问题了
// 直接比较式不行的,因为是unsigned,但是赋值给int就没有问题了
cout << strlen("abce") << endl;
if(strlen("abc")-strlen("absedd"))
cout << "yes" << endl;
else
cout << "no" << endl;
char s[10]="abc";
int b = strlen(s);
int d = strlen("bced");
if(b-b)
cout << "hi" << endl;
else
cout << " n" <<endl;
return 0;
}
strcpy方法
char *strcpy(char *destination,const char *source);
函数原型
1. 前面的是目标文件(destination)后面的是 资源文件
2. 将资源文件拷贝到源文件中
char s1[3]="ab";
char s2[3]="he";
strcpy(s1,s2);
cout << s1 << endl;//输出为he,后面的拷贝到前面的
要求:
3. 目标文件是可以被修改的,所以不是const
4. 目标文件足够大,可以放下源字符串
5. 源字符串中必须包含\0,这样才能停下来
6. 会将源字符串中的\0也拷贝到目标文件
strcat使用
char* strcat(char *destination,const char *source);
功能是将源字符串添加到目标字符串,覆盖目标字符串的终止符号,同时形成新的字符串,末尾带\0(这是字符串存储特点决定的)
char s1[3]="ab"; //长度为2
char s2[9]="hesdfadf";// 长度为8,但是仍然可以拼接
strcat(s1,s2);
cout << s1 << endl;
cout << strlen(s1) << endl;//输出结果为10
- 两个都必须是带有\0;
- 将源字符串的第一个字母代替目标字符串的终止符
- 自己不能复制给自己
- 组合成新的字符串,原来的字符串就改变了,包括大小
strcmp
字符串比较函数
int strcmp(const char *str1,const char *str2);
1. 两者都是字符数组
2. 返回值是一个整数
3. char s1[3]="pb"; //长度为2
char s2[9]="hesdfadf";// 长度为8,但是仍然可以拼接
cout << "比较大小为:"<<endl;
cout << strcmp(s1,s2) << endl;
第一个比第二大,输出为1;
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
比较注意事项
4. 是比较单个字符数字的大小,不是长度,比较的依据是ASCII码值
比较字符串s1和字符串s2的过程可以这样描述:
情况一:如果s1[0] > s2[0],停止比较,结果是s1 > s2;
情况二:如果s1[0] == s2[0],继续比较,直到不等,不相等时字符的比较结果即为字符串的比较结果。
2.可以调节长度的字符串,但需要知道的
strncpy字符串、strncmp、strncat
1.strncpy
将字符串中部分的内容复制到第一个字符串,仍然需要注意对应的长度问题
char* strncpy(char *destination, const char *source, size_t num);
1. 数字选择是如果低于目标源字符串,那么复制一部分,剩余的留下
2. 数量过高,补充\0;
3. char s1[3]="ab";
char s2[5]="bced";
strncpy(s1,s2,10);//这个数字的问题
cout << s1 << endl;
cout << strlen(s1) << endl;//4
2.strncat
就是连接,caught 连接的意思
char* strncat(char *destination, const char *source, size_t num);
char s1[3]="ab";
char s2[5]="bced";
strncat(s1,s2,6);
cout << s1 << endl;
cout << strlen(s1) << endl;//6
return 0;
- 附加源的第一个num字符到目标,加上一个终止的null字符。就是替代
2.如果源文件中C字符串的长度小于num,则只复制到终止null字符之前的内容。(数字再大只有这么多久给这么多就行)
3.strncmp
int strncmp(const char * str1, const char * str2, size_t num);
因为带返回值int类型,所以无法单独使用
char s1[3]="ab";
char s2[5]="bced";
cout << strncmp(s1,s2,6) <<endl;
return 0;
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
3.字符串查找函数
1. strchr
char * strchr ( const char *string, char c);
1. 因为对应的位置不好表示而且返回的是指针,所以直接输出来看
char s1[9]="abdse";
char s2[6]="bceds";
cout << strchr(s1,'b') << endl;//输出bdse
功能:查找字符串s中首先出现字符c的位置
说明: 返回首次出现c的位置的指针,如果不存在,返回null
使用的注意事项
- 因为是数组所以有大小,由大小就有越界的可能性,数组溢出了。
- char d[2]={‘a’,‘b’}; //单个赋值,没有\0,系统认为字符串没有结束,所以不报错但无法输出
- char e[2]=“ab”; // 这样对于字符串来讲,这个字符串的长度时3,但是数组大小为2,所以出现了问题。
- 由于内存单元是连续的,对于字符串,系统没有没有找到\0就会认为该字符串还没有结束,一直往后找,直到遇到\0位置。从而超出了定义的范围,所以报错
- 如果提前发现\0,提前结束,后面的都没有 char e[3]={‘1’,’\0’,‘3’};
- 字符数组长度的计算
- 存储的时候,长度时要包括最后的‘\0’,系统会加,但是不会开辟内存空间
- 如果太短,如char s[4]=“abcd”;这样的直接报错
- 如果字符串的长度小于数组的长度,那么字符串中的字符赋值给前面的元素,剩余的内存空间系统会自动使用‘\0’表示,因为结尾是\0,所以不用担心
- 空格要敲,但是不要多个,因为一个空格一个字符,如果多个就是多个字符了