char字符数组常见定义方式
char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char a[6]={"hello"};
char a[]={"hello"};
char a[] = "Hello";
//还有一种是用八进制或十六进制代表其ASCII码指代的字符
char类字符串以'\0'结尾 ,最多能储存的字符个数=字符串长度-1('\0');
思考
如果写成以下这样,会出现什么情况?为什么?有没有风险?
char a[5] = {'H', 'e', 'l', 'l', 'o'};
char b[] = {'H', 'e', 'l', 'l', 'o'};
cout<<a<<endl;
cout<<b;
字符数组全部初始化
初始化为NULL即'\0'(空字符)(空字符不是space空格字符,空字符的ASCII码是0,ASCII名称是NULL;空格字符的ASCII码是32,ASCII名称是SP)
int a[100]={0};//这里的0不是'0'字符,不要混淆
部分初始化
计算字符数组本身的长度
sizeof()函数
样例
char a[100]="hello";
char b[100]={0};
char c[]="hello";
char d[]={'h','e','l','l','\0'};
char e[]={'h','e','l','l'};
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
cout<<sizeof(e)<<endl;
输出
10
10
6
5
4
计算字符串的长度
方法一
strlen函数
char a[100]="hello";
int len1=strlen(a);//strlen函数有返回值
int len2=strlen("hello");
cout<<len1<<endl;
cout<<len2<<endl;
cout<<strlen("hello");
输出结果为
5
5
5
strlen仅仅是一个计数器的功能,遇到空字符串'\0'则停止计算,strlen返回第一个'\0\之前的字符长度;
strlen只计算可见的字符,而不把空字符计算在内;
strlen()函数返回的是储存在数组中的字符串的长度,而不是数组本身的长度;
什么是可见字符
在ASCII码表中,算上空格, 从32到126共95个是可见字符,不算上空格则为94个。也叫打印字符,即可以被直接打印出来的字符。剩下的则是不可见字符,即不可以被直接打印出来。
方法二
for循环
char a[100]="hello";
int len=0;
for(;a[i]!='\0';len++){
}
cout<<len;
输出结果为
5
输入
cin
说明
cin输入时遇到空格时则终止读取;cin会过滤掉不可见字符(如空格、回车、tab等)。
例如
char a[100]
cin>>a;
输入样例
awdfef fef4
dwa54f4e64f
5rg4rg1 e5f464g
fef 5r4gf f gr grg
输出样例
awdfef
dwa54f4e64f
5rg4rg1
fef
输出
方法一
char a[100]="hello";
cout<<a;
方法二
char a[100]="hello";
int len=strlen(a);
for(int i=0;i<len;i++)
cout<<a[i];
cin.getline()
说明
getline()读取一行输入,遇到空格字符时不会忽略,只有遇到换行符才会返回并丢弃换行符
用法
cin.getline(char字符数组名,需要输入的最大字符长度);
样例
int a[100];
cin.getline(a,100);//最多输入99个字符,即(0,99);
cout<<a;
输入
awdfef fef4
dwa54f4e64f
5rg4rg1 e5f464g
fef 5r4gf f gr grg
输出
awdfef fef4
dwa54f4e64f
5rg4rg1 e5f464g
fef 5r4gf f gr grg
cin.get()
说明
get()读取一行输入,不忽略空格字符,直到到达换行符。get()将换行符保留在输入序列中
效果展示
int n=3;
while(n--)
{
char a[100];
cin.get(a,100)//最多输入99个字符,即(0,99);
cout<<a<<endl;
}
输入一组字符串,回车
hello world \\回车
输出
那么为什么只输入一组字符串,循环就结束了呢?
get()将换行符'\n'保留在输入序列中,第二次循环时cin.get()看到换行符后,将认为是一个空行,并将空字符串赋给a数组。
解决方法是在读取地址之前先读取并丢弃换行符,可以使用没有参数的cin.get();
方法一
样例
int n=3;
while(n--)
{
char a[100];
cin.get(a,100);
cin.get();
cout<<a<<endl;
}
输入
hello world \\回车
输出
方法二
int n=3;
while(n--)
{
char a[100];
char ch='\n';
cin.get(a,100);
cin.get(ch);
cout<<a<<endl;
}
效果和上面一样
思考
如果写成以下这样,会出现什么情况?为什么?怎么解决?
int n=3;
while(n--)
{
char a[100];
char b[100];
cin>>a;
cin.get(b,100);
cout<<a<<endl;
cout<<b<<endl;
}
提醒:当cin读取数组a时,将回车键生成的换行符留在输入队列中,解决方案参考上一个例子