putchar

Removing multiple blanks using putchar and getchar in C

こ雲淡風輕ζ 提交于 2021-02-16 18:24:27
问题 Problem: Write a program that receives textual input using getchar() and outputs the string, having removed multiples blanks. Here's how I wrote the pseudo-code: While each input character is received before reaching EOF, do the following: 1) if character is non-blank, print it out 2) otherwise: a. print out the blank b. do nothing untill the next non-blank character 3) if a non-blank character is reached, go back to 1) I tried to implement the algorithm as such: #include <stdio.h> /*

[置顶]
读入优化&输出优化

流过昼夜 提交于 2020-03-15 19:43:35
注意了注意了注意了,重要的事情说3遍,这个东西是骗分神器,骗分神器,骗分神器!!! 众所周知:scanf比cin快得多,printf比cout快得多,如果你不知道就……就现在知道了 那有没有更快的呢?当然。 请看: 我懵逼了,至于慢近100ms吗? 好吧,这就是读入优化的效果,在数据很恐怖的情况下能比scanf多过1-5个点…… 比如说这种: 都说了要读入优化你还不读入优化,那不是找死吗…… 前面都是废话,现在开始说正事 读入优化 首先,读入优化这里是只是针对整数,getchar读字符是非常快的,所以我们就用getchar了。(下面都假设输入的数为x) 负数处理 很简单,用一个标志变量f,开始时为1,当读入了’-’时,f变为-1,最后 x*=f 即可 绝对值部分处理 显然getchar每次只能读一位,所以,每当读了一位时x*=10,为这一位“留位置”。 举个例子:现在读入了123,x为123,再读入了一个4,x*=10,变为了1230,现在它的最后一位空出来了,正好留给4,x+=4,x就变为了1234,当然,这里的’4’是char类型,需要减去’0’才是4,即: x=x*10+s-'0' (s为当前输入的字符) 关于细节 很多时候是有多余空格或者其他的乱码字符输入,为了防止bug,我们要严谨~详见代码。 代码 void read(int &x)//'&'表示引用

c++ 读入优化、输出优化模板

て烟熏妆下的殇ゞ 提交于 2020-03-15 19:43:18
  0. 在有些输入数据很多的变态题中,scanf会大大拖慢程序的时间,cin就更慢了,所以就出现了读入优化。其原理就是一个一个字符的读入,输出优化同理,主要使用getchar,putchar函数。   1. int型读入优化(long long的只要把x改成long long型即可): 1 #include<cctype> 2 inline int read() 3 { 4 int x=0,f=0; char ch=0; 5 while(!isdigit(ch)) {f|=ch=='-';ch=getchar();} 6 while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); 7 return f?-x:x; 8 }   2.double型读入优化: 1 inline double dbread() 2 { 3 double x=0,y=1.0; int f=0; char ch=0; 4 while(!isdigit(ch)) {f|=ch=='-';ch=getchar();} 5 while(isdigit(ch)) x=x*10+(ch^48),ch=getchar(); 6 ch=getchar(); 7 while(isdigit(ch)) x+=(y/=10)*(ch^48),ch=getchar(); 8

C语言之getchar()用法

非 Y 不嫁゛ 提交于 2020-03-06 13:42:24
(1)语法 int getchar(void); (2)返回值 getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。 (3)作用 从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符(’\n’)时退出,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消’\n’的影响,可以用getchar()来清除,如:while((c=getchar())!=’\n’),这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。 例: 1 #include <stdio.h> 2   int main

MSP430程序库<九>数码管显示

帅比萌擦擦* 提交于 2020-02-19 10:36:33
数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。七段(这里用的是8段,有小数点)数码管可以完成显示0-9数字和一部分的英文字符如:A、b。本文实现的程序完成显示数字和可显示的英文字符;同时完成数码管显示的printf函数的移植,以支持printf的格式化字符等好用的特点(我用的数码管8个排为一排,方便数字等的显示)。 硬件介绍: 这里所用到的硬件资源包括8个数码管、和msp430单片机的两个8位IO口(这里用的是P3和P5口,如有改变,可以通过宏定义更改)。 数码管是8个共阴的数码管,a-h 8段通过一个200Ω的电阻接到430单片机的P5口。共阴端是由单片机的P3口控制,单片机的一位IO通过一个三极管接到数码管的共阴端,以完成位选。 单片机的P3口时数码管的位选口,某位为高则选中;P5口时段选口;要数码管显示时,通过P3位选,选中某个数码管亮,P5段选选择8段(a-h)中的那些亮,从而控制某一位显示数字或字符。 要同时显示多个数码管,就要动态扫描;动态扫描时,本程序选用的是由看门狗的中断扫描显示:每1.9ms显示其中的一位,动态扫描显示每一位,从而让数码管看起来是同时亮的。 程序实现: 数码管显示首先要有一个数码管显示的断码表(完成数字和字符到数码管段值的表),程序中采用了《MSP430系列单片机系统工程设计与实践》这本书推荐的方式实现的这个数码表

模板 输入输出优化

强颜欢笑 提交于 2020-02-12 14:59:52
inline int read() { char ch, c=' '; int res; while (ch = getchar(), ch < '0' || ch>'9') c = ch; res = ch - 48; while (ch = getchar(), ch >= '0' && ch <= '9') res = (res << 3) + (res << 1) + ch - 48; return c == '-' ? -res : res; } void write(int x) { if (x < 0) putchar('-'), x = -x; if (x > 9) write(x / 10); putchar(x % 10 + '0'); return; } inline int read() { char ch, c; int res; while (ch = getchar(), ch < '0' || ch>'9') c = ch; res = ch - 48; while (ch = getchar(), ch >= '0' && ch <= '9') res = (res << 3) + (res << 1) + ch - 48; return c == '-' ? -res : res; } void write(int x) { if (x < 0)

Educational Codeforces Round 76 (Rated for Div. 2)

筅森魡賤 提交于 2020-02-09 20:46:36
A. Two Rival Students (CF 1257 A) 题目大意 有 \(n\) 个学生,给定两个学生的初始站位,可以交换最多 \(k\) 次相邻学生位置,要求那两个学生相距最远,问该距离是多少? 解题思路 移到边边就好了。 神奇的代码 #include <bits/stdc++.h> #define MIN(a,b) ((((a)<(b)?(a):(b)))) #define MAX(a,b) ((((a)>(b)?(a):(b)))) #define ABS(a) ((((a)>0?(a):-(a)))) using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; typedef vector<PII> VPII; typedef vector<LL> VL; typedef pair<LL,LL> PLL; typedef vector<PLL> VPLL; template <typename T> void read(T &x) { int s = 0, c = getchar(); x = 0; while (isspace(c)) c = getchar(); if (c == 45) s = 1, c = getchar();

C语言的puts(),gets(),putchar(),getchar()

穿精又带淫゛_ 提交于 2020-02-09 19:05:02
其实puts(),gets()属于字符串输入函数。 putchar()与getchar()属于字符输入函数。 1.字符函数 #include<stdio.h> int main(){ char c; printf(“请输入一个字符:”); c=getchar(); putchar(c); return 0; }  输出结果如下:记住下面输出的虽然是数字,本质上是字符。 2.字符串函数 #include<stdio.h> int main(){ char str[20]; printf("请输入一组长度不长于20的字符串:"); gets(str); puts(str); return 0; } 3.因为上面都是单次输入,所以不用考虑回车符滞留在内存所带来的错误,下面带来由于for循环带来的回车符所引起的错误: #include<stdio.h> int main() { int i = 0; for (i = 0; i < 200; i++) { printf("请输入一个字符:"); char c = getchar(); putchar(c); printf("\n"); } return 0; } 你会发现虽然输出了正确结果,但是会多输出一个空白的,其实这个的就是回车。你第一次输入的时候输了一个字符‘2’,而且按了一下回车,所以此时你存入内存存了这两个字符,但是getchar

Codeforces Round #592 (Div. 2)

假装没事ソ 提交于 2020-02-04 12:13:02
A. Pens and Pencils (CF 1244 A) 题目大意 给定 \(a,b,c,d,k\) ,问是否 \(\lceil \dfrac{a}{c} \rceil + \lceil \dfrac{b}{d} \rceil \leq k\) ? 解题思路 快速读懂题意即可。 神奇的代码 #include <bits/stdc++.h> #define MIN(a,b) ((((a)<(b)?(a):(b)))) #define MAX(a,b) ((((a)>(b)?(a):(b)))) #define ABS(a) ((((a)>0?(a):-(a)))) using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; typedef vector<PII> VPII; typedef vector<LL> VL; typedef pair<LL,LL> PLL; typedef vector<PLL> VPLL; template <typename T> void read(T &x) { int s = 0, c = getchar(); x = 0; while (isspace(c)) c = getchar(); if (c == 45

51单片机putchar函数的说明

落花浮王杯 提交于 2020-02-03 15:50:59
原文 排版远些乱,整理了一下。 1 #include <reg51.h> 2 3 #define XON 0x11 /*串口流控制符 启动*/ 4 #define XOFF 0x13 /*串口流控制符 中断*/ 5 6 /* putchar (full version): expands '\n' into CR LF and handles 完整版 每次发送数据都要检查sbuf是否有中断信号 7 *XON/XOFF (Ctrl+S/Ctrl+Q) protocol XON启动 XOFF中断 通信协议*/ 8 char putchar (char c) 9 { 10 if (c == '\n') /*判断是否是换行符的原因,是因为字符串的标准格式是末尾为\r(回车符)\n(换行符)这两个字符*/ 11 { 12 if (RI)          /*判断接收标识符是否为1,若为1则说明SBUF接受到了信息*/ 13 { 14 if (SBUF == XOFF)  /*判断SBUF中的信息是否为中断信号 是则执行以下程序*/ 15 { 16 do 17 { 18 RI = 0; /*将接收标识符置1 可以继续接收信息*/ 19 while (!RI); /*判断是否接收到了信息,是则往下循环*/ 20 }while (SBUF != XON); /*判断接收的信息是否为启动信息