scanf的使用及一些注意事项

Posted xpybsh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scanf的使用及一些注意事项相关的知识,希望对你有一定的参考价值。

  相比较Java的键盘录入,C语言的scanf有一些需要注意的细节,为了避免使用的时候踩坑,我们就来了解一下scanf。

  scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单:

1 int a;
2 scanf("%d",&a);//程序执行到这里时,就等待用户输入;它接收的是变量的地址
          //所以一般情况下除了指针型变量和数组名要给变量加上取地址符&

注意事项一:内存溢出(输入的类型要和占位符一致就不拿出来单独啰嗦了)

1     char s[1];//长度为1,只能存一个元素
2     printf("请输入s的值:"); 
3     //因为这里使用的是数组名,数组名就是地址,所以不用加取地址符& 
4     scanf("%s",s); //输入abcd 
5     printf("s=%s
",s);       

技术图片

 

 

 诶,照结果来看abcd都被存进字符数组s里面了,但是我们知道,s是不是只能存一个字节的数据,所以bcd已经非法占用内存了。虽然有时候程序看起来会正常执行,但是它会留下一些隐患。使用的时候需要注意这一点。

注意事项二:录入多个变量

1     double m,n;
2     printf("请输入m、n:"); 
3     //占位符不写东西时,录入的时候默认以空格分隔
    //如果占位符用逗号分隔,录入的时候用逗号分隔 4 scanf("%lf%lf",&m,&n);// scanf("%lf,%lf",&m,&n); 5 printf("n=%lf m=%lf ",m,n);

技术图片

 

 

 如果我将第四行代码换成注释的代码就需要这样用:

技术图片

 

 

 输入的时候用空格分隔会发生什么呢

技术图片

 

可以看到,n的值没能录入。建议使用默认的分隔符,占位符中不要自己加东西。

注意事项三:char类型

 1     char name[10]="";
 2     int age=0;
 3     double sal=0.0;
 4     char gender=a;//m代表man w代表woman 
 5     
 6     printf("请输入名字:");
 7     scanf("%s",name);//数组名,不用加&
 8      
 9     printf("请输入年龄:");
10     scanf("%d",&age);
11      
12     printf("请输入薪水:");
13     scanf("%lf",&sal);
14      
15     printf("请输入性别:");
16      //scanf中char类型会出现接收上面的回车字符,一个字节被占了,所以获取不到录入的数据 
17     scanf("%c",&gender); 
18     //所以再接收一次 
19     scanf("%c",&gender); 
20           
21     printf("姓名:%s 
年龄:%d 
薪水:%lf 
性别:%c",name,age,sal,gender);  

先看一下去掉19行代码会发生什么:

技术图片

 

 

 乱吧,性别没法输入吧;加上19行之后,也就是再获取一次字符之后:

技术图片

 

以上是关于scanf的使用及一些注意事项的主要内容,如果未能解决你的问题,请参考以下文章

OJ中的一些注意事项

编程中的一些注意点汇总

postman断言作用及怎么使用

Java 程序代码书写风格及一些简单的注意事项 (

Golang实践录:反射reflect的一些研究及代码汇总

ajax与 axios的基础讲解(附代码及接口)