加入收藏 | 设为首页 | 会员中心 | 我要投稿 吉安站长网 (https://www.0796zz.com.cn/)- 科技、图像处理、媒体智能、办公协同、操作系统!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C语言字符数组和字符串解析

发布时间:2022-07-01 12:11:56 所属栏目:语言 来源:互联网
导读:用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={c, , p, r, o, g, r, a,m}; // 给部分数组元素赋值 char d[]={c, , p, r, o, g, r, a, m }; //对全体元素赋值时可以省去长度 字符数组实际上
  用来存放字符的数组称为字符数组,例如:
  char a[10];  //一维字符数组
  char b[5][10];  //二维字符数组
  char c[20]={'c', '  ', 'p', 'r', 'o', 'g', 'r', 'a','m'};  // 给部分数组元素赋值
  char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };  //对全体元素赋值时可以省去长度
  字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
 
  C语言规定,可以将字符串直接赋值给字符数组,例如:
  char str[30] = {"c.biancheng.net"};
  char str[30] = "c.biancheng.net";  //这种形式更加简洁,实际开发中常用
  数组第 0 个元素为'c',第 1 个元素为'.',第 2 个元素为'b',后面的元素以此类推。
 
  为了方便,你也可以不指定数组长度,从而写作:
  char str[] = {"c.biancheng.net"};
  char str[] = "c.biancheng.net";  //这种形式更加简洁,实际开发中常用
  给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。
 
  这里需要留意一个坑,字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。请看下面的例子:
  char str[7];
  str = "abc123";  //错误
  //正确
  str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
  str[3] = '1'; str[4] = '2'; str[5] = '3';
  字符串结束标志(划重点)
  字符串是一系列连续的字符的组合,要想在内存中定位一个字符串,除了要知道它的开头,还要知道它的结尾。找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以;然而,如何找到字符串的结尾呢?C语言的解决方案有点奇妙,或者说有点奇葩。
 
  在C语言中,字符串总是以''作为结尾,所以''也被称为字符串结束标志,或者字符串结束符。
  ''是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。
  C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到''就认为到达了字符串的末尾,就结束处理。''至关重要,没有''就意味着永远也到达不了字符串的结尾。
 
  由" "包围的字符串会自动在末尾添加''。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'',这个过程是在后台默默地进行的,所以我们感受不到。
 
  下图演示了"C program"在内存中的存储情形:
 
 
  需要注意的是,逐个字符地给数组赋值并不会自动添加'',例如:
  char str[] = {'a', 'b', 'c'};
  数组 str 的长度为 3,而不是 4,因为最后没有''。
 
  当用字符数组存储字符串时,要特别注意'',要为''留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:
  char str[7] = "abc123";
  "abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的''。如果将 str 的长度定义为 6,它就无法容纳''了。
  当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,这就为以后的错误埋下了伏笔,读者自己要多多注意。
 
  有些时候,程序的逻辑要求我们必须逐个字符地为数组赋值,这个时候就很容易遗忘字符串结束标志''。下面的代码中,我们将 26 个大写英文字符存入字符数组,并以字符串的形式输出:
  #include <stdio.h>
  int main(){
      char str[30];
      char c;
      int i;
      for(c=65,i=0; c<=90; c++,i++){
          str[i] = c;
      }
      printf("%sn", str);
      return 0;
  }
  在 VS2015 下的运行结果:
  ABCDEFGHIJKLMNOPQRSTUVWXYZ口口口口i口口0 ?
 
  要想避免这些问题也很容易,在字符串的最后手动添加''即可。修改上面的代码,在循环结束后添加'':
  #include <stdio.h>
  int main(){
      char str[30];
      char c;
      int i;
      for(c=65,i=0; c<=90; c++,i++){
          str[i] = c;
      }
      str[i] = 0;  //此处为添加的代码,也可以写作 str[i] = '';
      printf("%sn", str);
     
      return 0;
  }
  第 9 行为新添加的代码,它让字符串能够正常结束。根据 ASCII 码表,字符''的编码值就是 0。

(编辑:吉安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读