C语言字符串及指向字符数组的指针

字符数组长度

通常编译器在“肉眼所能看见的”字符数组末尾还会加一个“\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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值