【字符数组】
作者:互联网
字符数组字符串字符指针相关知识
1.字符数组
字符数组也是数组,所以只能在定义的时候进行初始化,并且不能将一个数组赋值给另一个数组;所以给数组赋值的方法有三种:
第一种,定义的时候初始化:
char a[10]={'a','b','c','v','\0'}; //注意只有加上\0才叫字符串。
第二种,用字符串常量初始化:
char a[10]="ada"; //
用引号括起的字符串会隐式包含\0,所以不用显式的包含它;
第三种,如果在定义的时候没有显示的初始化,只能通过strcpy或者strncpy函数来赋值:
char a[10];
char b[10]="asd";
strcpy(a,b)
这种是可以的;
注意不能直接用=直接复制,如下的代码是错误的
char a[10];
char b[10]="dasdad";
a=b; //wrong
你可能认为a是一个地址,b也是一个地址,把b的地址赋值给a,使得a也指向b是可以的,但是注意
前面有数组a的定义:char a[10];这表明a是指向堆栈中的一块内存,现在又把他改成指向b,这是不合法的;
所以数组之间不能相互赋值;
但是把数组名赋值给一个字符指针是可以的,即如下的代码能通过:
char *q=null;
char a[10]="dasd";
q=a;//这是可以的,将q指向数组a,此时q也叫数组指针;
还有一个点需要注意的是:字符常量和字符串常量;
字符常量’S’,其实表示是ASCII的代号,即’S’表示的是83;你可以这样来使用:
int a=‘S’;//a=83;
而字符串常量表示的是字符串所在的首地址;
2.字符数组的输入
如下:
char name[100];
cin>>name;
一般来说可以这样来将字符串读到数组当中。并且输入工具会自动加上结尾的空字符;
但是这样有两个问题:
第一个就是cin默认结束的标志是空白字符(即空格,制表,换行符),如果你输入的字符串中包含空格,那么cin读到第一个空格处就停止了;如下:
char name[100];
cout<<"enter your name: "; //假设输入bob tilun
cin>>name;
那么最终name读入的只有bob,遇到空格就自动停止了,而且下次需要读取的时候直接从tilun开始读;
第二个问题是,数组大小是有限的,上述中最大为100;你不能保证用户输入是不超过100的;
基于这个问题,istream类中提供了两个成员函数:getline()和get();用来读取面向行的输入,还能指定读取的个数;
首先我们来看,getline();
它一般来说接收两个参数,一个是读入的数组,第二个是读取的个数。如果是20的话,那么它最多读19个字符,剩下一个补\0;
getline()在遇到换行符或读满的时候停止,如果遇到换行符,他会直接将换行符改成\0存入数组。即缓冲区变为空(这是它与get()一个最主要的区别);
get(),同样接收两个参数,但是不同的是它遇到换行符停止的时候会把换行符留在缓冲区中。这回造成下次读取的一些问题,所以要进行处理。
连续两次调用get()会出现问题,因为第一次调用缓冲区会留下一个换行符,第二次调用它看见换行符会认为是空行,对于get()来说会设置失效位,使得接下来的输入被阻断,必须用cin.clear().才能恢复。
如果用户输入的字符串比数组空间大,则剩下的输入会留在缓冲区中,对于get()来说下次直接读,对于getline()来说会设置失效位,造成输入阻断。
标签:字符,10,char,数组,字符串,换行符 来源: https://blog.csdn.net/m0_61021562/article/details/123633752