字符数组长度
通常编译器在“肉眼所能看见的”字符数组末尾还会加一个“\0”作为结束符
所以真正的字符长度是“肉眼所见长度”+1
char str[5]="Hello";
如上代码是会编译错误的
指针和字符串
一.指针和一维字符数组
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char *s="Hello World";
char *s2="Hello World";
s[0]='B';//这一段会报错,s[0]属于只读区域
printf("s[0]=%c\n",s[0]);
char s3[]="Hello World";
printf("s= %p\n",s);
printf("s2=%p\n",s2);
s3[0]='B';
printf("s3[0]=%c\n",s3[0]);
}
之前的blog已经介绍过,指针可以当做数组用
C语言数组作为函数参数及指针与数组的关系
但是指针和字符数组并不完全相同
1.指针被当做字符数组初始化之后单个字符不可以被直接赋值,s被保存在一段只读区域中
char *s="Hello World";
char *s2="Hello World";
s[0]='B';//这一段会报错,s[0]属于只读区域
printf("s[0]=%c\n",s[0]);
若要修改,需用字符数组
如下:
char s3[]="Hello World";
printf("s= %p\n",s);
printf("s2=%p\n",s2);
s3[0]='B';
printf("s3[0]=%c\n",s3[0]);
2.指针虽然无法修改单个字符,但可以直接将整个字符串换掉,也就是直接指向另一个字符串
如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char s[100]="afjdkajfl";
char *ptr="abcedf";
//s="xyz";
ptr="xyz";
printf("%s\n",s);
printf("%s",ptr);
}
运行结果:
可以看到,ptr指向的值已经被换掉了,而代码中隐掉的s="xyz"是违规操作,会编译错误 定义了字符数组之后不能对该字符数组进行直接赋值
3.对于字符型指针变量在没有指向字符数组的时候 除了一开始可以令指针变量指向一个常量存储区外 之后如果想要读入新的数据必须开辟新的内存空间
第一种:未开辟新的内存空间(运行时会报错)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int main(){
char *name="李智恩";
puts(name);
//name=(char*)malloc(sizeof(char)*10);
scanf("%s",name);
puts(name);
free(name);
return 0;
}
第二种:开辟新的内存空间
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int main(){
char *name="李智恩";
puts(name);
name=(char*)malloc(sizeof(char)*10);
scanf("%s",name);
puts(name);
free(name);
return 0;
}
运行结果
二.指针和多维字符数组
我们知道,对于二维数组而言,它的第二维的大小不可省略
前面已经提过 (star)a 可以作为一维数组使用,同样的*a[]也可以作为二维数组使用
下面我们用一张图来进行对比
字符串输入输出
1.scanf("%s",string);读到空格/回车/Tab
2.相对安全的输入
scanf("%7s",s);(给定读入的字符串长度,不过依然不能读空格)
3.getchar() putchar() (输入输出一个字符)
char ch;
while ((ch=getchar())!=EOF){
putchar(ch);
}
4.gets() puts()可以录入空格 (回车符结束)
字符串函数
1.strcpy
具体操作
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char s1[1000]="abcdefghijklmn";
char s2[1000]="123";
strcpy(s1,s2);//把s2复制到s1对应位置上(包括结束符'\0')
puts(s1);
puts(s1+4);
return 0;
}
运行结果
所以,s1实际上变成了
123\0efghijklmn(中间有个结束符)
2.strcat(s1,s2); 把s2接到s1后面
指针与字符串常见错误
1.未对指针初始化
如
char *string;
scanf("%s",string);
string指向未知内存,容易出错,要初始化为0