字符数组的解释与使用

定义

  • 字符数组,第一个就是数组,所以需要有大小,符号【】
  • 第二个就是,存放字符的数组,由于存放的是字符
    • 表示字符的前缀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
  1. 两个都必须是带有\0;
  2. 将源字符串的第一个字母代替目标字符串的终止符
  3. 自己不能复制给自己
  4. 组合成新的字符串,原来的字符串就改变了,包括大小
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;
  1. 附加源的第一个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;

标准规定:

  1. 第一个字符串大于第二个字符串,则返回大于0的数字
  2. 第一个字符串等于第二个字符串,则返回0
  3. 第一个字符串小于第二个字符串,则返回小于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,所以不用担心
  • 空格要敲,但是不要多个,因为一个空格一个字符,如果多个就是多个字符了
发布了12 篇原创文章 · 获赞 3 · 访问量 4122

猜你喜欢

转载自blog.csdn.net/QT_continue/article/details/105595426