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\n",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\n",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 \n年龄:%d \n薪水:%lf \n性别:%c",name,age,sal,gender);  

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

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

原文地址:https://www.cnblogs.com/xpybsh/p/12616286.html

时间: 2024-10-31 10:05:57

scanf的使用及一些注意事项的相关文章

数据类型、变量常量、运算符

1.进制换算 X进制转换为十进制   按权求和 十进制转换为X进制   连除倒取余 2.基本数据类型 3.常量 变量 常量:程序运行期间不能被改变的值 变量:变量代表一个存储区域:存储区域的值就是变量的值,变量的值可以在运行期间改变. 4.运算符 4.1  ++   --运算  b = a++;等价于  b = a; a =  a + 1; b = ++a;等价于  a = a+ 1; b = a;  运算符在前,先执?行;运算符在 后,后执?行. 4.2  交换两个数的值 5.表达式(必有结果

C语言打印输出,scanf使用注意事项,小技巧

 今天看一帖子,赵忠大哥的回复挺经典也很有用,记录下来! 1.在每个最后不带\n的printf后面加fflush(stdout); 2.在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);另外请检查scanf的返回值. 3.在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题. C语言打印输出,scanf使用注意事项,小技巧

字符串操作练习以及scanf()的注意事项

/* ============================================================================ Name : String.c Author : lf Version : Copyright : Your copyright notice Description : 字符串操作练习以及scanf()的注意事项 1 字符串的插入 2 删除字符串中的字符 3 scanf()的注意事项 ==========================

c语言的scanf函数注意事项

.scanf函数的注意事项 *1.回车可以刷新键盘缓冲区的内容 *2.单个字符要用单撇号括起来 *3.   scanf("%d",&b);//如果给b正确输入,那么a的值就是一个换行符. scanf("%c",&a);//如果给b输入一个字符型(不正确输入),那么这个字符型就会赋值给a *4.scanf("%d%d",&a,&b);//对于输入连续的整形或者浮点型数据,可以用空白符起到间隔数据的作用,字符型的话不用

scanf() gets() fgets()使用注意事项

1.scanf() 遇到'\n'停止从输入缓冲区中接收,接收完后'\n'还存在于缓冲区中.当输入的字符数少于缓冲区大小时,字符后面有自动补上'\0',当输入字符大于缓冲区时,也直接拷贝到缓冲中,因此缓冲区大小应注意以免产生段错误. 2.gets() 当输入的字符串低于缓冲区长度时,以'\n''\0'结尾,此时缓冲区中什么也没留下:当输入的字符串大于缓冲区长度时,也会全部存入缓冲区中,注意缓冲区大小以免产生段错误,此时缓冲区中什么也没留下. 3.fgets() 从文件字节流中获取指定长度的字符串并

关于cin,getchar(),scanf()的注意事项(转)

  问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因.下面先看一个很简单的程序:程序1:    #include <stdio.h>    int main()    {char ch1, ch2;scanf("%c", &ch1); scanf("%c", &

scanf()函数的注意事项

1 /* 2 time:2018年5月23日18:57:52 3 author:Howie Tang 4 title:scanf()函数的总结 5 */ 6 #include <stdio.h> 7 8 int main(void) 9 { 10 //1.输入的数据之间必须用空格.回车符.制表符等间隔开 11 int i; 12 float j; 13 double k; 14 scanf("%d%f%le",&i,&j,&k); 15 printf

scanf(&quot;%c&quot;, &amp;ch)和scanf(&quot; %c&quot;, &amp;ch)和scanf(&quot;%s&quot;, str)的注意事项

scanf("%c", &ch)和scanf(" %c", &ch): %c会读取回车和空格,所以一定要使用后者,即在%c前面加一个空格. %s用于读取char[]时,会忽略空格和回车,所以不会有这些问题. 原文地址:https://www.cnblogs.com/FengZeng666/p/11448043.html

黑马程序员——C语言基础---scanf函数

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,scanf函数的概念 scanf函数也叫阻塞式函数,也就是说当函数执行后,会等待用户的输入,如果用户不输入任何内容,他会一直等待.如果使用这个函数,必须包含一个头文件 stdio.h. 2,scanf函数的作用 从键盘接受用户输入的内容,保存到指定的变量中. 3,scanf函数的格式 scanf("格式控制符",输入项的地址列表); 4,scanf函数的用法 输入一个整数 int