看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩?

哈哈,确实,一起来认识一下这朵数组界的奇葩吧!

一、字符数组的定义、引用、初始化

大家好!我是字符数组,看我的名字就知道啦,我是由字符型元素构成哒!

我的定义方式和元素引用方式和一般数组相同哦,我们可是一家人哦!

  1. char line [];

这是定义了一个长度为 80 的一维字符数组。

  1. char m [] [];

这是定义了一个 2 行 3 列的二维字符数组。

  1. printf ("%c", line []);

这是在应用数组元素。

so easy!

字符的初始化方法可以分为两种:

(1) 将字符逐个赋给数组中的每个元素;

  1. char c [] = {'c', 'h', 'i', 'n', 'a'};

 这是把5个字符分别赋给 c [0] ~ c [4] 这 5 个元素中。

(2) 直接用字符串常量给数组赋初值。

  1. char c [] = "china";

 看到这个例子,又有好奇的小伙伴发问了:china 这不只有5个字符吗?为啥前面写着 6 ?

 实验检验真知,让我们把 5 和 6 都运行一下:

 当括号里面写成 5 时,程序就会被报错!

 当括号里面写成 6 时,程序就会正常!

有些小伙伴的头上是不是出现了许多问号呢?

先别着急,下面小编就会把谜底揭开。

敲黑板!我们要知道:无论用以上哪种方法进行初始化,如果提供的字符个数大于数组长度,系统就会进行语法错误处理,比如上面的情况;如果提供的字符个数小于数组长度,则只会给前面几个元素赋值,剩下的自动设置为0,即 ’\0‘。

给你吃个栗子:

  1. char a [] = {'c', 'h', 'i', 'n', 'a'}

这里我们定义了10个长度,但只给 5 个元素赋值,那么这个数组的状态就会是:

c h i n a \0 \0 \0 \0 \0

二、字符串和字符串结束的标志

现在就是揭示谜底的时候啦!

首先我们区分一下“字符常量”和“字符串常量”:

字符常量(一颗山楂)                  字符串常量(简称:字符串)(一串糖葫芦)
用单引号括起来 用双引号括起来
一个字符 一串字符
不必有结束字符 '\0' 要有结束字符 '\0'

回到前面:

  1. char c [] = "china"

这里的"china"就是一个字符串,

C语言约定用'\0'作为字符串的结束标志,它占内存空间。这里的"china"的有效长度为 5 ,但实际上还有第 6 个字符'\0'。

也就是说,当遇到'\0'时,表示字符串结束,由它前面的字符组成字符串。

在程序中,常用'\0'来判断字符串是否结束,因此所定义的字符数组长度应该大于字符串的实际长度,这样才足以存放相应的字符串,这就是前面为什么写 6 而不是 5 的原因,当然,写 7 也是没有问题的。

注意:'\0'是代表ASCII码值为 0 的字符,是一个不可显示的字符,表示一个“空字符”,也就是说它什么也没有,只是一个可供识别的标志。

三、字符数组的输入和输出

首先说下赋值语句,注意,赋值 ≠ 初始化!

和整型数组等一样,字符数组是不能用赋值语句整体赋值,如下代码是错误的!!!

  1. char str [];
  2. str [] = "the string";

对于一般数组而言,输入和输出的时候只能对数组元素一个一个进行;

而对于字符数组,就显得神通广大了,它不仅可以逐个输入输出,还可以整体输入输出!

(1) 逐个字符输入/输出

  ① 使用 scanf 进行输入,使用 printf 进行输出,这个时候,要使用格式符 “%c”;

  1. for (i = ; i < ; i++)
  2. scanf ("%c", &str [i]); //逐个输入
  3. for (i = ; i < ; i++)
  4. printf ("%c", str [i]); //逐个输出

  注意:输入的时候不要丢掉 “&” 哦!

  ②使用 getchar() 和 putchar() 函数。

  1. for (i = ; i < ; i++)
  2. str [i] = getchar (); //逐个输入
  3. for (i = ; i < ; i++)
  4. putchar (str [i]); //逐个输出

(2) 字符串整体输入输出

  ①使用 scanf 进行输入,使用 printf 进行输出,这个时候,要使用格式符 “%s”;

  1. char str [];
  2. scanf ("%s", str) //整体输入
  3. printf ("%s", str) //整体输出

  注意:scanf 中的 str 代表 str 这个字符数组的首地址,因此不加“&”!输入时系统会自动在字符串结尾加上结束符 '\0'。

  也可以同时输入多个字符串,这个时候输入的时候要用空格或者回车符号分隔开。

  ② 用字符串处理函数 gets() 进行字符串整串的输入,puts() 进行字符串整串的输出

  这种方法我们待会儿再讲。

对于字符数组的输入和输出,应当指出的是:

(1)输出字符不包括'\0';

(2)用格式符"%s"时,输出项应该是数组名,不是数组元素;

(3)当数组长度大于字符串实际长度时,也只能输出到'\0'结束;

(4)如果数组中包含一个以上的’\0‘时,遇到第一个’\0‘时结束输出,比如:

四、字符串函数

C语言有一批字符串处理函数,其中 gets() 和 puts() 函数包含在头文件<stdio.h>中,其余的包含在<string.h>中。

下面,小编来介绍一下常用的 8 个字符串函数。

(1)整行输入函数 gets()

 一般形式:gets(字符数组),例如:

  1. gets (str);

 执行这个语句时,gets函数从键盘读入一串字符,直至遇到换行符’\n‘为止;

 字符串输入后,系统会自动用'\0'置于字符串的尾部,以替代换行符。

(2)整行输出函数 puts()

 一般形式:puts(字符数组),例如:

  1. char str [] = "string";
  2. puts (str);

 这个函数的作用是将字符串中的内容显示在屏幕上,直到遇到第一个字符串结束符'\0'时。停止输出并自动换行。

 用puts函数输出的字符串中可以出现转义字符,用于实现某种格式的控制。例如:

(3)字符串长度函数 strlen()

 一般形式:strlen(字符数组),例如:

  1. char str[]="string";
  2. strlen (str);
  1. strlen ("string");

 该函数用于统计字符串开始到’\0‘的有效长度。

(4)字符串连接函数 strcat()

 一般形式:strcat(字符数组1, 字符数组2),例如:

  1. char str1 []= "I am ";
  2. char str2 [] = student”;
  3. strcat (str1, atr2);

 这个函数的作用是将字符数组 2 连接在字符数组 1 上,就像嫁接一样。

 连接前后的情况如下:

  连接前 连接后
str1
  1. I am \0\0\0\0\0\0\0\0\0\0
 I am student\0\0\0
str2  student\0   student\0

 注意:字符数组1的长度要足够大哦!

(5)字符串复制函数 strcpy()

 一般形式:strcpy(字符数组1, 字符数组2),例如:

  1. char str[];
  2. strcpy (str, "china");

 我们前面讲到,不能用赋值语句对数组整体赋值,那赋值的时候可以一个一个对元素赋值,但是这种方法很是繁琐,而这里的 strcpy 函数可以轻松搞定。

 比如上面这段代码,就把str中的前 5 个字符赋值为了“china”。

 这里要说明一下:

 在向字符数组1中复制(或者“赋值”)时,字符数组2中的结束标志'\0'也被复制过去了,比如:

  复制前 复制后
str1 abcdefg\0 &&&\0efg\0
srr2 &&&\0 &&&\0

 复制后的str1中出现了两个'\0',则用 "printf("%s", str1)" 和 “puts(str1)” 输出时,只会输出“&&&”。

(6)字符串比较函数 strcmp()

 一般形式:strcmp(字符数组1, 字符数组2)

 这里的比较是比较什么呢?长度?

 No!

 它的规则是:

 对两个字符串自左向右逐个字符进行比较——按ASCII码值大小比较,直到出现不同字符或者遇到'\0'为止。

 注意:这里比较 是ASCII码值!

 如果全部字符都相同,则认为相等;

 若出现不同的字符,则以第一个不同的字符的比较结果为准;

  ● 如果字符串1 = 字符串2,函数值为 0;

  ● 如果字符串1 > 字符串2,函数值为一正数;

  ● 如果字符串1 < 字符串2,函数值为 一负数;

 想看清晰的戳这里>> https://www.bilibili.com/video/BV1764y1M78v/

(7)字符串中的大写字母换成小写字母函数 strlwr()

  strlwr中的“lwr”是lowercase(小写)的缩写,运用很简单,如图:

(8)字符串中的大写字母换成小写字母函数 strupr()

  strupr中的“upr”是uppercase(大写)的缩写。

学完这8中字符串处理函数,是不是感觉站在了巨人的肩膀上,不过我们也要自己尝试编写这几种函数哦。

五、二维的字符数组

上面我们只介绍了数组中只有一个字符串的情况,那如果想存储多个字符串呢?

用一个双引号“ ”括起来的字符串可以被当做一个一维数组,

而多个字符串,也就是多个一维数组,就需要二维数组来存放。

因此,一个 m×n 的二维字符数组可以存放 m 个字符串,其中每个字符串的长度不超过n-1(要保留一个位置存放'\0')。

比如:

c h i n a \0 \0 \0 \0 \0
a b c \0 \0 \0 \0 \0 \0 \0

好啦,吃了这么多干货,是不是有些渴呢?下面我们用所学的知识编写一个小程序:

问题描述:一个公司有若干员工。编写一个程序,实现如下功能:输入一个职工的姓名,要求查询职工是否属于该公司,并输出相应的信息。

小编思路:

  1、首先建立二维字符数组 w[100][10],用于存放公司中所有职工的名字,每个职工的员工名字都是一个一维数组;同时建立一个一维字符数组 name[10],用于存放要查找的对象姓名;

  2、接着来一个循环,将公司职工的姓名进行输入;

  3、再来一个循环,进行多次查询的操作;

  4、在查询中,将要查询的姓名与二维字符数组中的姓名用字符串函数 strcmp 一个一个作比较,如果循环后结果为0,则是公司职工,否则不是。

  5、在这个程序中,因为要多次输入,因此每次输入前用 fflush(stdin)来清除缓冲区的内容(每次输入后的回车符存储在缓冲区)。

代码展示:

  1. #include "stdio.h"
  2. #include "string.h"
  3. main ()
  4. {
  5. char w [][];
  6. int n = , i = , j, m;
  7. char name[];
  8. printf("请输入该公司所有员工的姓名:\n");
  9. while (n == )
  10. {
  11. printf("%d:", i+);
  12. fflush(stdin);
  13. gets(w[i]);
  14. printf("如果要继续输入,请输入数字1:");
  15. fflush(stdin);
  16. scanf ("%d", &n);
  17. i++;
  18. }
  19. n = ;
  20. while (n == )
  21. {
  22. printf("请输入要查询的姓名:");
  23. fflush(stdin);
  24. gets(name);
  25. for (j = ; j < i; j++)
  26. {
  27. m = strcmp(name, w[j]);
  28. if (m ==)
  29. {
  30. break;
  31. }
  32. }
  33. if (m == ) printf("该职工属于该公司!");
  34. else printf("该职工不属于该公司!");
  35. printf("如果要继续查询,请输入数字1:");
  36. fflush(stdin);
  37. scanf ("%d", &n);
  38. }
  39. }

本次的分享就到这里啦,欢迎小伙伴前来交流!

预告:C语言字符数组应用举例

2020-04-28

16:55:04

C语言字符数组超细讲解的更多相关文章

  1. C语言二维数组超细讲解

    用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...

  2. 超细讲解Django打造大型企业官网

    本文为知了课堂黄勇老师讲的<超细讲解Django打造大型企业官网>的笔记. 第一章 Django预热 1.创建virtualenv虚拟环境 2.URL组成部分详解 3.Django介绍 4 ...

  3. C语言 字符数组与字符指针比较

    C语言 字符数组与字符指针比较 #include<stdio.h> /* 字符数组会在定以后预先分配内存空间字符串是常量所以会直接把字符串拷贝到数组中, 因为数组地址不同,所以不相等· 字 ...

  4. [c语言]字符数组、字符串定义

    C语言中字符串通常用字符指针和字符数组来定义: char* pS="abcdef"; char s[]="abcdef"; 这两种方式都会在结尾为字符串隐式补结 ...

  5. 【转】C语言 字符数组与字符串

    原文:http://blog.csdn.net/metasearch/article/details/2856097 在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串.总结起来 ...

  6. c语言字符数组与字符串的使用详解

    转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...

  7. c语言字符数组和指针的经典用法

    1.字符数组 许多情况下,对字符串的处理使用字符数组会更加方便,比如: 我觉得不改变字符串的原有顺序,对字符串进行删除等操作时,使用字符数组效果会更好. eg:给定字符串(ASCII码0-255)数组 ...

  8. C 语言字符数组的定义与初始化

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'} ...

  9. C语言字符数组和字符串

    用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...

随机推荐

  1. [noip模拟]心<并查集>

    背景描述: 不是一切深渊都是灭亡 不是一切灭亡都覆盖在弱者的头上 ——<这也是一切> 舒婷 有N个透明的盒子, 每个盒子里面有两个不同颜色的球, 总共有M种颜色. Alice和Bob又在玩 ...

  2. [vijos1883]月光的魔法<递归>

    题目链接:https://vijos.org/p/1883 这道题还有另外一种版本叫天神下凡,属于模拟题,可是模拟题数据太水以至于模拟题A了都不一定在vijos上A.... 在模拟题里我用的是一种类似 ...

  3. 逃生 HDU 4857(反向建图 + 拓扑排序)

    逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...

  4. Oracle ROWNUM用法

    很多朋友应该跟我一样有个疑问,为什么rownum > 5 的时候会查不到一条数据,用rownum < 5就可以查到数据,明明查询所有的时候rownum有很多啊,小朋友,你是不是有很多问号? ...

  5. PTA数据结构与算法题目集(中文) 7-16

    PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分)   设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000 ...

  6. MyBatis(七):使用注解替代xml文件

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  7. MySQL学习之路3-MySQL中常用数据类型

    MySQL中常用数据类型 字符型 存储字符型数据.例如姓名,地址,电话号码等.使用引号括起来,一般使用单引号. 常用类型: char(255) 定长字符串,最大长度255个字符. varchar(25 ...

  8. "额外插入的文本"组件:<ins> —— 快应用组件库H-UI

     <import name="ins" src="../Common/ui/h-ui/text/c_tag_underline"></imp ...

  9. go中的error小结

    go中的error error和panic error接口 go中err的困局 推荐方法 总结 参考 go中的error go中的错误处理,是通过返回值的形式来出来,要么你忽略,要么你处理(处理也可以 ...

  10. tf.nn.softmax 分类

    tf.nn.softmax(logits,axis=None,name=None,dim=None) 参数: logits:一个非空的Tensor.必须是下列类型之一:half, float32,fl ...