c++字符笔记(二)

本文详细介绍了C++中的字符数组,包括定义格式、初始化、赋值方法(字符初始化、字符串初始化、数组元素赋值)、输入输出(scanf、cin、gets函数对比)及应用技巧,如处理空格输入和数组元素计数。还特别强调了输入输出的注意事项和安全性问题,如避免数组溢出。
摘要由CSDN通过智能技术生成

目录

一、字符数组的定义

字符数组的定义格式:

二、字符数组的赋值

1、用字符初始化数组

2、用字符串初始化数组

【注意】

3、数组元素赋值

三、字符数组的输入

1.scanf语句。

2. cin语句。

3. gets语句。

4. 三种输入方法优缺点比较:

字符数组的输出

1.printf语句。

2.cout语句。

3.puts语句。

应用技巧

【应用技巧1】

【应用技巧2】


果有错误,大佬们告诉我,我会改正!!!

一、字符数组的定义

字符数组是指元素为字符的数组。字符数组是用来存放字符序列或字符串的。字符数组也有一维、二维和三维之分

字符数组的定义格式:

  字符数组定义格式同于一般数组,所不同的数组类型字符型,第一个元素同样是从ch1[0]开始,而不是ch1[1]。具体格式如下:

  [存储类型] char 数组名[常量表达式1]

  例如:

  char ch1[5]; //数组ch1是一个具有5个字符元素的一维字符数组。

char ch2[3][5]; //数组ch2是一个具有15个字符元素的二维字符数组。

二、字符数组的赋值

   字符数组赋值类似于一维数组,赋值分为数组的初始化和数组元素的赋值。初始化的方式有用字符初始化和用字符串初始化两种,也有用初始值表进行初始化的。

1、用字符初始化数组

char 变量名[5]={‘a’,‘b’,‘c’,‘d’,‘e’};

  初始值表中的每个数据项是一个字符,用字符给数组chr1的各个元素初始化。当初始值个数少于元素个数时,从首元素开始赋值,剩余元素默认为空字符

  字符数组中也可以存放若干个字符,也可以来存放字符串。两者的区别是字符串有一结束符(‘\0’)

反过来说,在一维字符数组中存放着带有结束符的若干个字符称为字符串字符串是一维数组,但是一维字符数组不等于字符串。

char 变量名[5]={‘a’,‘b’,‘c’,‘d’,‘\0’}; 即在数组变量名中存放着一个字符串“abcd”

2、用字符串初始化数组

 用一个字符串初始化一个一维字符数组,可以写成下列形式:

char chr2[5]=“abcd”;

【注意】

        使用此格式均要注意字符串的长度应小于字符数组的大小或等于字符数组的大小减1。同理,对二维字符数组来讲,可存放若干个字符串。可使用由若干个字符串组成的初始值表给二维字符数组初始化。

  例如:char chr3[3][4]={“abc”,“mno”,“xyz”};

在数组ch3中存放3个字符串,每个字符串的长度不得大于37

3、数组元素赋值

字符数组的赋值是给该字符数组的各个元素赋一个字符值。

  例如:

   char chr[3];

   chr[0]=‘a’; chr[1]=‘b’;chr[2]=‘c’;

  【注】:对二维、三维字符数组也是如此。

        当需要将一个数组的全部元素值赋予另一数组时,不可以用数组名直接赋值的方式,要使用字符串拷贝函数来完成。

三、字符数组的输入

1.scanf语句。

使用格式:scanf(“%s”,字符数组名称);

字符数组名称之前不需要加取地址符&

一次性读入多个字符,遇到空格、回车、Tab键结束读入。

char name[100];

scanf(“%s”,name);

输入的字符数组从下标0开始存储。

如:输入了John,则,name[0]=’J’,name[1]=’o’,name[2]=’h’,name[3]=’n’,name[4]=’\0’;

char name[100];

scanf(“%s”,name+1);

这样的话,那么

name[1]=’J’,

name[2]=’o’,

name[3]=’h’,

name[4]=’n’,

name[5]=’\0’。

2. cin语句。

cin遇到空格、回车、Tab键结束,使用如下:

char name[100];

cin>>name; //从下标0开始存储

cin>>name+1; //从下标1开始存储

3. gets语句。

使用格式:gets(字符数组名称);

gets语句只能输入一个字符数组,遇回车结束(区别于cin和scanf),

使用方法如下:

char name[100];

gets(name); //从下标0开始存储

gets(name+1); //从下标1开始存储

4. 三种输入方法优缺点比较:

        scanf和cin两种输入方法遇空格或者回车结束,gets遇回车结束,所以gets语句可以接受输入中含有空格,例如,输入“hello world”之后回车,使用scanf或者cin语句,字符数组的内容为“hello”,但是使用gets语句字符数组的内容为“hello world”;

cin语句较scanf语句而言,速度较慢。

        另外,gets在读取字符时由于其自身没有约束缓冲区(待写入的字符数组)而造成溢出错误,使用时注意开辟的字符数组空间要足够大。而且gets对于一些不可见的字符(最典型的就是换行)的处理存在问题,使用时需谨慎。

字符数组的输出

1.printf语句。

使用格式:printf (“%s”,字符数组名称);

char name[100];

printf (“%s”,name); //从下标0开始存储

2.cout语句。

使用格式:cout<<字符数组名称;

char name[100];

cout<<name; //从下标0开始存储

3.puts语句。

使用格式:puts (字符数组名称);

puts语句只能输出一个字符数组,使用方法如下:

char name[100];

puts(name); //从下标0开始存储

【注意】:输入和输出一定要对应!!!

应用技巧

【应用技巧1】

字符数组中出现空格时,应使用gets()函数读取

【应用技巧2】

字符数组元素作为下标实现数组元素的计数

        这样的技巧用到了桶排序的部分思想,我们一起来回忆桶排序,设定计数数组cnt,可以将其作为桶,数组里的每一个元素a[i]可以当做下标,使用cnt[a[i]]++自动匹配。

假设,数组定义为:“int a[6]={0,2,3,2,3,4};”

下标 a[i]的值 执行操作:cnt[a[i]]++

1       2           cnt[2]=1

2       3           cnt[3]=1

3       2           cnt[2]=2

4       3           cnt[3]=2

5 4 cnt[4]=1

        值得一提的是,我们将a[i]作为cnt数组的下标,a[i]最大为4,所以设定计数数组cnt大小为5,所以当我们把数组元素作为下标的时候,cnt计数数组大小最小的值为:max(a[i])+1。有一些题目会要求我们统计数组元素的出现次数,所以掌握该技巧就显得非常必要。

【应用技巧3】二维字符数组的输入方法

        二维字符数组,每一行,都是一维字符数组,所以,我们枚举行n,对于每一行,我们读入一维字符数组即可。

【应用技巧4】字符当数字使用

记得关注我,我会每日更~~~ 

点个赞嘛~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值