原题: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读取时,你得告诉他往哪里存储读进来的数据,所以要告诉他“地址”。
本身表示的就是地址信息的,就不需要加&来取地址。