哦这。。!C语言scanf输入的坑爹之处
一、
今天闲来无事,跑去A题,本想3sA了poj1004,结果搞了10分钟,最令人困惑的问题就是为什么定义了double类型的变量,但是用scanf输入的时候标识符用%f的话,输入并不能完成,也就是说输入不会起作用,后来查找资料,才知道,原来用double 输入的时候标识符是%lf,注意这里是L和F,不是1和f
经过修正终于搞定,分分钟A了这个水题。
然而后来再想 A 就A不过去了,,,,并不知道为什么。好吧,忽略这种细节,没什么难度的水题没必要太在意,代码如下:
#include<cstdio>
int main(){
double t,d;
for(int i=;i<;i++){
scanf("%lf",&t);
d+=t;
}
printf("$%.2f",d/);
}
二、除了上面的坑之外,scanf输入还有一些坑爹的小细节:
在用scanf输入的时候,如果输入的是字符%c,则scanf会将空白符(空格,回车,tab)一并读入,所以一般要加一个getchar来获取空白符。
scanf("%c",&t);//这种写法,t中存储的也可以有空白符
解决空白字符被当作char读入的问题
在做题的时候,有时会碰到输入数据给的不规范的情况,比如一行结束后不只有一个回车而是多个,再比如很多个空白符之后才是回车,由于空白符(Tab,回车,空格)会被当作char ,所以今天我们来解决这个问题
1、如果输入不存在不规范:getchar()或%*c
但是毕竟在后面加一个getchar实在是很麻烦的做法,所以,我们可以用scanf的另一种写法来“吃掉”回车符:
char a,b;
int num;
scanf("%c%c%*c%d",&a,&b,&num);//注意这里的%*c
这里我给大家演示另外一种方法,就是%*,这表示这个输入读取之后我们是不给他变量来存储的,这样就相当于“吃掉了”中间的字符,前两个字符以及最后的数字都会正确读取。
如果我们把这一点用在scanf的format串的末尾,就可以做到“吃掉”回车了,为了怕我忘,我还是写下来吧:
这种带星号的用法,叫做“赋值禁止字符”.,在scanf的返回值中,是不会计算%*的这量的,也就是说,scanf返回的值是成功存入的变量的个数。
//赋值禁止字符的使用
char a,b,c;
scanf("%c%c%c%*c",&a,&b,&c);//回车就会被吃掉
但是如果输入的是字符串%s,则scanf会忽略空白符。
并且,%s其实也可以存储在字符中,不过%s的缺点是,如果要把值存储在字符中,则只存储第一个字符,其余字符就会被舍弃,这样就会造成字符的丢失
scanf("%s",&t);//可能造成字符丢失
2.如果数据不规范,不能保证一定符合格式,更稳妥的方法如下:
scanf会跳过%c之前所有的空白符,同理,如果不是空格而是\t或\n,则会跳过所有Tab和所有回车。
scanf(" %c",&t);//注意这里在%c之前有空格!!!
这次有个题就因为这个wa了两天,坑死我了。。。5555555555
哦这。。!C语言scanf输入的坑爹之处的更多相关文章
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- C语言清空输入缓冲区的N种方法对比
转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...
- 测试scanf输入含非法控制符
心得: 学到scanf命令时第一个想到的就是可以利用scanf做一个十进制转16进制.八进制的小程序,很天真的以为也可以转二进制,在搜索字符控制符的时候才知道原来没有二进制的控制字符,需要换算出来得出 ...
- C语言清空输入缓冲区
来源:http://blog.csdn.net/guanyasu/article/details/53153705 https://zhidao.baidu.com/question/5241738. ...
- C语言程序设计--输入与输出
C语言的输入 所有的输入都是依赖于C语言函数进行的,这个函数是C语言标准库自带的,定义在头文件<stdio.h>里面,所以,要想使用与输入相关的函数,都需要包含这个头文件 #include ...
- C语言 scanf()和gets()函数的区别
C语言 scanf()和gets()函数的区别 1.相同点:scanf( )函数和gets( )函数都可用于输入字符串 2.不同点:两者在功能上有所区别,具体区别如下: 要实现如下需求“从控制台输入字 ...
- C语言scanf与get char,gets的区别
C语言scanf与get char,gets的区别 1.scanf() scanf是C语言的格式输入函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并 ...
- 【C语言】输入一个整数N,求N以内的素数之和
[C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...
- C语言:输入一个数,输出比这个数小的所有素数,并求出个数。
//C语言:输入一个数,输出比这个数小的所有素数,并求出个数. #include<conio.h> #include<stdio.h> #include<stdlib.h ...
随机推荐
- [NOIP2017 TG D2T2]宝藏(模拟退火)
题目大意:$NOIPD2T2$宝藏 题解:正常做法:状压DP .这次模拟退火,随机一个排列,$O(n^2)$贪心按排列的顺序加入生成树 卡点:没开$long\;long$,接受较劣解时判断打错,没判$ ...
- [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]
题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...
- 【BZOJ 3123】 [Sdoi2013]森林 主席树启发式合并
我们直接按父子关系建主席树,然后记录倍增方便以后求LCA,同时用并查集维护根节点,而且还要记录根节点对应的size,用来对其启发式合并,然后每当我们合并的时候我们都要暴力拆小的一部分重复以上部分,总时 ...
- init_connect基本用法
服务器为每个连接的客户端执行的字符串.字符串由一个或多个SQL语句组成.要想指定多个语句,用分号间隔开.例如,每个客户端开始时默认启用autocommit模式.没有全局服务器变量可以规定autocom ...
- 用npm安装express时报proxy的错误的解决方法
首先要说明一点:当使用npm install <module-name>时安装组件时,安装的目录是cmd的目录+node_modules+组件名 例子如下:假如你现在安装express这个 ...
- Eclipse来push,fetch,rebase代码
如何与项目里的其他人一起合作项目,提交代码并更新呢?这里提出我比最近用到的两种工具:一种是Eclipse,另外一个是SourceTree.个人推荐从事Java开发的话,可以用Eclipse.当然,还有 ...
- vue与node模版引擎的渲染标记{{}}(双花括号)冲突
由于之前练习koa2,直接渲染的jquery写的传统页面. 这次想偷懒,直接script引入vue,发现渲染不出data值. 渲染引擎用得是xtpl, 找了半天没有发现可以修改xtpl渲染分隔符的配置 ...
- P3076 [USACO13FEB]出租车Taxi
题目描述 Bessie is running a taxi service for the other cows on the farm. The cows have been gathering a ...
- Spring securiuty 过滤器
1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...
- BZOJ 2095: [Poi2010]Bridges
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 869 Solved: 299[Submit][Stat ...