沧州旅游网:C语言字符数组超细解说

admin/2020-04-29/ 分类:科技/阅读:

看到题目,有不少同伙会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?难道它是朵奇葩?

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

一、字符数组的界说、引用、初始化

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

我的界说方式和元素引用方式和一样平常数组相同哦,我们可是一家人哦!

 

 

char line [80];

 

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

char m [2] [3];

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

printf ("%c", line [2]);

这是在应用数组元素。

so easy!

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

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

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

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

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

char c [6] = "china";

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

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

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

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

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

 

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

 

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

给你吃个栗子:

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

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

c h i n a

 

二、字符串和字符串竣事的标志

现在就是展现谜底的时刻啦!

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

字符常量(一颗山楂)                  字符串常量(简称:字符串)(一串糖葫芦)
单引号括起来 双引号括起来
字符 字符
不必有竣事字符 '' 要有竣事字符 ''

回到前面:

char c [6] = "china"

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

C语言约定用''作为字符串的竣事标志它占内存空间。这里的"china"的有用长度为 5 ,但现实上另有第 6 个字符''。

也就是说,当遇到''时,示意字符串竣事,由它前面的字符组成字符串。

在程序中,常用''来判断字符串是否竣事,因此所界说的字符数组长度应该大于字符串的现实长度,这样才足以存放响应的字符串,这就是前面为什么写 6 而不是 5 的缘故原由,固然,写 7 也是没有问题的。

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

 

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

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

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

char str [12]; str [12] = "the string";

对于一样平常数组而言,输入和输出的时刻只能对数组元素一个一个举行;

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

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

  ① 使用 scanf 举行输入,使用 printf 举行输出,这个时刻,要使用花样符 “%c”

for (i = 0; i < 10; i ) scanf ("%c", &str [i]); //逐个输入 for (i = 0; i < 10; i ) printf ("%c", str [i]); //逐个输出

  注重:输入的时刻不要丢掉 “&” 哦!

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

for (i = 0; i < 10; i ) str [i] = getchar (); //逐个输入 for (i = 0; i < 10; i ) putchar (str [i]); //逐个输出

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

  ①使用 scanf 举行输入,使用 printf 举行输出,这个时刻,要使用花样符 “%s”

char str [6]; scanf ("%s", str) //整体输入 printf ("%s", str) //整体输出

  注重:scanf 中的 str 代表 str 这个字符数组的首地址,因此不加“&”!输入时系统会自动在字符串末端加上竣事符 ''。

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

 

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

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

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

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

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

(3)当数组长度大于字符串现实长度时,也只能输出到''竣事;

(4)若是数组中包罗一个以上的’‘时,遇到第一个’‘时竣事输出,好比:

 

四、字符串函数

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

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

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

 一样平常形式:gets(字符数组),例如:

gets (str);

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

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

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

 一样平常形式:puts(字符数组),例如:

char str [] = "string"; puts (str);

 这个函数的作用是将字符串中的内容显示在屏幕上,直到遇到第一个字符串竣事符''时。住手输出并自动换行。

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

 

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

 一样平常形式:strlen(字符数组),例如:

char str[]="string"; strlen (str);
strlen ("string");

 该函数用于统计字符串最先到’‘的有用长度。

(4)字符串毗邻函数 strcat()

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

char str1 [15]= "I am "; char str2 [] = “student”; strcat (str1, atr2);

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

 毗邻前后的情形如下:

  毗邻前 毗邻后
str1
I am 
 I am student
str2  student   student

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

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

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

char str[10]; strcpy (str, "china");

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

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

 这里要说明一下:

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

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

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

(6)字符串对照函数 strcmp()

 一样平常形式:strcmp(字符数组1, 字符数组2)

 这里的对照是对照什么呢?长度?

 No!

 它的规则是:

 对两个字符串自左向右逐个字符举行对照——按ASCII码值巨细对照,直到泛起差别字符或者遇到''为止。

 注重:这里对照 是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(要保留一个位置存放'')。

好比:

 

c h i n a
a b c

 

 

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

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

小编思绪:

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

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

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

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

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

代码展示:

#include "stdio.h" #include "string.h" main () { char w [100][10]; int n = 1, i = 0, j, m; char name[10]; printf("请输入该公司所有员工的姓名:n"); while (n == 1) { printf("%d:", i 1); fflush(stdin); gets(w[i]); printf("若是要继续输入,请输入数字1:"); fflush(stdin); scanf ("%d", &n); i ; } n = 1; while (n == 1) { printf("请输入要查询的姓名:"); fflush(stdin); gets(name); for (j = 0; j < i; j ) { m = strcmp(name, w[j]); if (m ==0) { break; } } if (m == 0) printf("该职工属于该公司!"); else printf("该职工不属于该公司!"); printf("若是要继续查询,请输入数字1:"); fflush(stdin); scanf ("%d", &n); } }

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

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

2020-04-28

16:55:04

,

申博sunbet

申博sunbet www.sunbet88.us是Sunbet指定的Sunbet官网,Sunbet提供Sunbet(Sunbet)、Sunbet、申博代理合作等业务。

TAG:
阅读:
广告 330*360
广告 330*360

热门文章

HOT NEWS
  • 周榜
  • 月榜
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码