zoukankan      html  css  js  c++  java
  • 【字符串】字符数组及其定义和初始化详解

    字符串的存储方式有字符数组和字符指针。

    因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对这些字符进行存储,即通过字符数组存储。字符数组是一个数组,且是存储字符的数组,该数组中一个元素存放字符串的一个字符。

    字符数组的定义

    因为字符数组首先是一个数组,所以前面讲的数组内容通通都适用。其次它是存放字符的数组,即数组的类型是char型。比如:

    1 char name[10];

    表示定义了10字节的连续内存空间。

    1)如果字符串的长度大于10,那么就存在语法错误。这里需要注意的是,这里指的“字符串的长度”包括最后的‘’。也就是说,虽然系统会自动在字符串的结尾加‘’,但它不会自动为‘’开辟内存空间。所以在定义数组长度的时候一定要考虑‘’。

    2)如果字符串的长度小于数组的长度,则只将字符串中的字符赋给数组中前面的元素,剩下的内存空间系统会自动用‘’填充。

    字符数组的初始化

    字符数组的初始化与数组的初始化一样,要么定义时初始化,要么定义后初始化,下面写一个程序来说明这个问题:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int main(void)
     4 {
     5     char a[10];
     6     a[0] = 'i'; a[1] = ' '; a[2] = 'l'; a[3] = 'o'; a[4] = 'v'; 
     7 //空格字符的单引号内一定要敲空格
     8     a[5] = 'e'; a[6] = ' '; a[7] = 'y'; a[8] = 'o'; a[9] = 'u'; 
     9 //空格字符的单引号内一定要敲空格
    10     a[10] = ''; 
    11     char b[10];
    12     b[0] = 'i'; b[1] = ' '; b[2] = 'm'; b[3] = 'i'; b[4] = 's'; 
    13 //空格字符的单引号内一定要敲空格
    14     b[5] = 's'; b[6] = ' '; b[7] = 'y'; b[8] = 'o'; b[9] = 'u'; 
    15 //空格字符的单引号内一定要敲空格
    16     char c[] = "i believe you";
    17     char d[] = {'i', ' ', 'l', 'i', 'k', 'e', ' ', 'y', 'o', 'u',''}; 
    18 //空格字符的单引号内一定要敲空格
    19     char e[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'}; 
    20 //空格字符的单引号内一定要敲空格
    21     char f[] = "上课睡觉觉, 下课打闹闹, 考试死翘翘";
    22     char g[10] = "";
    23     printf("a = %s
    ", a);  //输出字符串用%s, 输出参数必须写数组名
    24     printf("b = %s
    ", b);
    25     printf("c = %s
    ", c);
    26     printf("d = %s
    ", d);
    27     printf("e = %s
    ", e);
    28     printf("f = %s
    ", f);
    29     printf("g = %s
    ", g);
    30     return 0;
    31 }

    首先要说明的是,这个程序只有在.cpp文件中才能运行,在.c文件中会有很多错误。因为我们在前面讲过,C89标准规定变量的定义只能在程序的开头,或者说定义变量的前面不能有其他非声明或者非定义的语句。而.cpp文件是编写C++程序的,C++向下完全兼容C,而且它对变量定义的位置有特殊要求,只要在使用位置之前即可。

    数组a是先定义后初始化。一方面与以前讲的数值型数组一样,先定义后初始化必须一个一个地进行赋值,不能整体赋值;另一方面与以前讲的数值型数组又不一样,对于字符串,先定义后初始化也可以整体赋值,但是要调用strcpy函数,这点稍后再讲。

    总之上面这个程序中给数组a一个一个进行初始化的方式很麻烦。而且这样写需要注意:前面讲过系统会在字符串的最后自动添加结束标识符‘’,但是当一个一个赋值时,系统不会自动添加‘’,必须手动添加。如果忘记添加,虽然语法上没有错误,但是程序将无法达到我们想要的功能。数组b就是这样的例子。

    此外,空格字符必须要在单引号内"敲"一个空格,不能什么都不“敲”,什么都不“敲”就是语法错误。也不能多“敲”,因为一个单引号内只能放一个字符。“敲”多个空格就是多个字符了。

    数组b就是最后没有手动添加‘’的例子。程序是希望数组b输出“i miss you”,但输出结果是“i miss youi love you”.原因就是系统没有在最后添加‘’。

    虽然程序中对数组b的长度进行了限制,即长度为10,但是由于内存单元是连续的,对于字符串系统只要没有遇到‘’,就会认为该字符串还没有结束,就会一直往后找,直到遇到‘’为止。被找过的内存单元都会输出,从而超过定义的10字节。

    数组c是定义时初始化。定义时初始化可以整体赋值。整体赋值有一个明显的优点——方便。定义初始化可以不用指定数组的长度,而先定义后初始化自必须要指定数组的长度,如数组a和数组b。不用指定数组长度有一个好处:不用人为确定需要多少字节的内存空间,系统会根据初始化的内容自动分配数量正好的内存空间。而且对于数组c的写法系统会自动在最后添加标识符‘’,必须人为添加。忘记添加就会出现与数组b同样的错误。从数组e的输出结果可以看出这一点。

    数组 f 是存储汉字,汉字不能像数组 a 或数组 d 那样分开一个一个赋值。因为一个汉字占 2 字节,若分开赋值,由于一个单引号内只能放一个字符,即一字节,所以将占 2 字节的汉字放进去当然就出错了。因此如果用字符数组存储汉字的话必须整体赋值,即要么定义时初始化,要么调用 strcpy 函数。

     数组 g 初始化为一对双引号,表示该字符数组中 10 个元素的内容都为 ''。下面写一个程序验证一下:

    1 # include <stdio.h>
    2 int main(void)
    3 {
    4     char str[3] = "";
    5     str[2] = 'a';
    6     printf("str = %s
    ", str);
    7     return 0;
    8 }

    输出结果是:

    str =

    程序中定义了一个长度为 3 的字符数组,然后给第三个元素赋值为 'a',然后将整个字符数组输出。但是输出结果什么都没有,原因就是其直接初始化为一对双引号,此时字符数组中所有元素都是 ''。所以虽然第三个元素为 'a',但因为第一个元素为 '',而 '' 是字符串的结束标志符,所以无法输出。

    需要注意的是,使用此种初始化方式时一定要指定数组的长度,否则默认数组长度为 1。

    总结,字符数组与前面讲的数值数组有一个很大的区别,即字符数组可以通过“%s”一次性全部输出,而数值数组只能逐个输出每个元素。
     
     
  • 相关阅读:
    创意吃鱼法
    雅礼上课
    坏掉的项链Broken Necklace
    2018-04-02练习
    【11月12日】Hadoop架构
    【11月10日】Redis 主从复制技术
    【11月10日】Redis 缓存系统常见问题及解决方案
    【11月9日】Redis 持久化
    【11月7日】Redis核心对象和数据类型
    【11月7日】Redis简介
  • 原文地址:https://www.cnblogs.com/Luthais/p/10175099.html
Copyright © 2011-2022 走看看