“char *s;scanf(“%s“, s) ”为何报错?如何正确解决?

原题:scanf输入字符串,输出字符串的长度。必须用指针实现

这是起初我写的代码。

char* ch;
printf("请输入字符串:");
scanf("%s", ch);
int len = strlen(ch);
printf("%d\n", len);
return 0;

编译的过程中,程序会崩溃。

错误原因如下:

因为scanf("%s", ch);只传入了指针变量ch的值,scanf函数会直接把数据写到ch指向的内存空间中,而ch没有初始化,其指向的空间不能确定。所以在运行时如果写到了禁止访问的内存空间就会引发异常。

可以这样做

方法一:使用栈内存

char a[100], *s = a;

scanf("%s", s);

方法二:使用堆内存

char *s = (char *)malloc(10);

scanf("%s", s);

//处理

free(s);

s=NULL;

注意有malloc就要有free,free以后一定要马上对它赋值为NULL。

改进后的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	//方法1
	char* ch =(char*)malloc(sizeof(char) * 11);
	printf("请输入字符串:");
	scanf("%s",ch);
	int ret=strlen(ch);
	printf("%d\n", ret);
	free(ch);
	ch = NULL;
	return 0;

	//方法二
	char arr[30];
	char* ch = arr;
	printf("请输入字符串:");
	scanf("%s", ch);
	int len = strlen(ch);
	printf("%d\n", len);
	return 0;
}

也有些小伙伴可能也不清楚scanf(“输入的格式”,&ch(或者ch)),有时候前面加&,有什么不加,这是为什么?什么时候加?什么时候不加?

&是取地址运算符,scanf读取时,你得告诉他往哪里存储读进来的数据,所以要告诉他“地址”。

因此,对于本身无法表示地址信息的,往往要加&来“获取地址

本身表示的就是地址信息的,就不需要加&来取地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值