[笔记]scanf的使用(主要是针对char)
学的是C++,用cin cout也用的很顺溜,写自己的类时重载“<<”与“>>”运算符也很爽,但是发现在刷算法竞赛题时,cin cout很没优势,输入量大时一道题我用cin cout要50ms,用scanf printf只要10ms、20ms,这个就差的太大了时间都花在输入输出上也是很郁闷。于是开始使用C的输入输出标准。输出很正常,也可以轻松更改double输出的精度,c++还要个iomanip头文件,还烦一点。格式化字符%u %d %ld %lld %f %lf %s %c等就这几个限死了,也就是只能输入输出这几个系统自带的格式,是没法将自己的类重载到里面的,,只能自己做个print函数。不过毕竟面向对象是c++的内容。
就是那个输入scanf有些异类。首先输入得取地址,输入int的a要&a不能写a。这我总是忘记。先输入整形、long long、double、字符串什么的都没问题,可以任意换行。scanf(“%d%d%d%d”, &a, &b, &c, &d);
像下面这样输入
//123 2
//
//
// 23
//6
有任意空格和回车都可以接收。
而对于字符串char sss[100],不支持空格的读取,要读取空格得用gets()。
而scanf(“%s”,sss)还是scanf(“%s”,&sss)都可以,论坛里上说前者还少取个地址更快一点。
而对于char型,char ch;scanf(“%c”,ch);可以是可以,但是不能像int等一样随心所欲地加空格和回车,明明说好的scanf自带无视回车和空格。比如下一段代码
int main()
{
int a, b, c, d;
char x, y, z,s1[10],s2[10],s3[10];
scanf("%d%d%d%d", &a, &b, &c, &d);
scanf("%s%s%s", s1, s2, s3);
scanf("%c%c%c", &x, &y, &z);
printf("%c%c%c", x, y, z);
printf("%d%d%d%d\n'%c'\t'%c'\t'%c'\n%s\n%s\n%s", a, b, c, d, x, y, z,s1,s2,s3);
return 0;
}
输入:
111 222 333 444 555 666 777 8 9 0
输出:
111222333444
’ ’ ‘8’ ’ ’
555
666
777请按任意键继续…
而输入:
111
222
333
444
555
666
777
890
则输出:
111222333444
’
’ ‘8’ ‘9’
555
666
777请按任意键继续…
char的什么回车啊空格啊都读进去了。
而如果先读入char,一旦char坏掉了,后面也全乱了。
我总结的规律是:
scanf读取int等内容时,读取完一个数据后后面的空格回车仅仅是表示这个数据输入完了,没有略过,它一直存在于输入缓冲区,而到了下一个数据,若也是int或字符串什么的,会自动把空格回车略过,直到找到应输入的内容,然后读取。而char不同,它不忽略本该读取的数据前面的空白,就把那空格或回车读进去了,如果是有多个空格回车,剩下那些空白就依然还存在与缓冲区,给下一个char读取了。
我现在找到了以下几种解决方案
- 使用fflush(stdin)。scanf读取char之前,用fflush(stdin)空输入缓冲区,使其为空,然后输入char就不会有空白符阻碍了。
- scanf读取char之前使用getchar()把’\n’和’ ‘吃了,getchar()不跳过空格回车。当然getchar()几次,即吃几个字符也是个问题,所以本方法仅适用于比如竞赛题什么的,输入格式都很标准,不会出现不定多少的空格回车。不过现在想想好像scanf和getchar功能一样欸,都不跳空白的。那么这么说来直接用scanf吸收空格应该也是可以的,比如scanf(“%c%c”,&ch,&ch)但是好像没见人用过。
- VJ上看到这个写法scanf(“\n%c”,ch),即在每个输入char的scanf里的%c前面,都加上\n。对于在scanf里不仅仅写%c还写其他的东西,就像输出一样,我没细研究,就知道比如scanf(“233%c666”,ch)我必须先输入233再输入char再输入666,想想好像也有道理,以此来忽略\n,但是我发现它也可以忽略空格。虽然不是很懂,空格和回车在编译器眼里一样吗?于是试了试scanf(” %c”,ch),也一样的效果!于是这就达到了与输入int、double一样的格式,任意输入多少空格和回车都没事了。现在也是这么在用,虽然其实我不是很懂其原理。
- CSDN论坛里看到有12级的大神说不要用scanf输入字符。。不是很懂,全用getchar()吗。。。还是输入字符转用cin。。。 0.0 [震惊哭]。
附[方法三]实例:
int main()
{
int a, b, c, d;
char x, y, z,s1[10],s2[10],s3[10];
scanf("%d%d%d%d", &a, &b, &c, &d);
scanf("%s%s%s", s1, s2, s3);
scanf(" %c\n%c %c", &x, &y, &z);
//x = getchar(), y = getchar(), z = getchar();
printf("%d%d%d%d\n'%c'\t'%c'\t'%c'\n%s\n%s\n%s", a, b, c, d, x, y, z,s1,s2,s3);
return 0;
}
输入:(‘-’代表空格,为了方便观察,而且CSDN这个编辑器对多个空格强行忽略成一个,其实完全没必要合并多个空格和回车。好心办坏事)
1—2–3—
4—5–
–6–
—–7–
—-8–
-9–
——-0–
输出:
1234
‘8’ ‘9’ ‘0’
5
6
7请按任意键继续…
[笔记]scanf的使用(主要是针对char)的更多相关文章
- C本学习笔记scanf
一个.scanf功能介绍 这也是在stdio.h中声明的一个函数.因此使用前必须增加#include<stdio.h>. 调用scanf函数时,须要传入变量的地址作 ...
- [学习笔记]scanf弊端以及解决方案
#include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(void) { ]; //mems ...
- TDD学习笔记【三】---是否需针对非public方法进行测试?
前言 在Visual Studio 2012 中,针对Unit Test 的部分,有一个重要的变动: 原本针对「测试对象非public 的部分」,开发人员可通过Visual Studio 2010 自 ...
- c语言学习笔记 scanf和printf格式的问题
int a =0; int b =0; scanf("%d %d",&,&b); 上面这种和下面这种哪种对? int a =0; int b =0; scanf(& ...
- HTML学习笔记 iframe引用页面按列(针对target打开方式解释) 第九节 (原创)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 《C++标准程序库》笔记之三
本篇博客笔记顺序大体按照<C++标准程序库(第1版)>各章节顺序编排. ---------------------------------------------------------- ...
- JVM学习笔记——垃圾回收篇
JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
- C语言Scanf函数
C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...
- scanf与scanf_s的区别
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据 scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了 ...
随机推荐
- iwebshop里面传数组且输出
//php后台 $starttimestr = $arr[0]['forea_time']; $endtimestr = $arr[0]['end_time']; $data['starttime'] ...
- JS页面打开方式丶对话框及页面跳转方式
一.js页面的三种打开方式 1. window.open 2. window.navigate("url") 跳转到目标页面 3. window.location.href=&qu ...
- Vue.js 2.2 卡片api
给vue开发者和爱好者发送点福利! 卡片上一共117个api,方便查阅 网址: https://vuejs-tips.github.io/cheatsheet Github: https://gith ...
- jQuery购物车
效果图 HTML代码:(非表格方式) <div class="nav2"> <input type="checkbox" class=&quo ...
- as3中去掉字符串两边的空格,换行符
as3 去掉字符串两边的空格,换行符,方法一 ActionScript Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 pub ...
- Selenium测试专项三班隆重开班
Selenium测试专项三班隆重开班 应广大测试技术人员要求,以及企业技术需求.Selenium提前一周开课了,只针对合作的每家企业提供1-2个参训名额.预计培训60人次.但报名人数却远远超出我们预期 ...
- scrollWidth,offsetWidth,clientWidth,width;scrollHeight,offsetHeight,clientHeight,height;offsetTop,scrollTop,top;offsetLeft,scrollLeft,left还有谁
题中的那么多属性让人头都大了,他们到底是什么意思?不同浏览器的实现是一样的吗?以下所有结论来自chrome版本 53.0.2785.89 (64-bit)和firefox版本52.0.2,操作系统ub ...
- AngularJS1.X学习笔记2-数据绑定
上一篇从整体上认识了Angular,从现在开始更加深入的学习Angular的特性.本次学习的是数据绑定.应该所有的MVC框架都会用到数据绑定,比如我所知道的ThinkPHP.struts等,只有实现了 ...
- CentOS下安装node
下载 wget https://nodejs.org/dist/v7.7.4/node-v7.7.4-linux-x64.tar.gz 解压 tar -zxvf node-v7.7.4-linux-x ...
- 转接口IC NCS8807:LVDS转MINI LVDS芯片
LVDS 4K TCON w/ Scaler1 General Description NCS8807 is an LVDS 4K TCON with advanced scaling func ...