【c++】 scanf,printf,gets(),getchar()以及eof

首先解决一下gets()与scanf的区别:

scanf()不会读入空格或者换行符,结束输入时,缓冲区还有换行符,而gets()则会读入空格或换行符,并将换行符转换为0,缓冲区不会剩下换行符,所以先scanf又换行后,用到gets()时,直接用,只会读一个换行符并转换为0,加上一个getchar()接收换行符,才能读到真正的字符串,而scanf()换行后又用到scanf则不用getchar(), 即从第一个不是空格和换行符开始,读到空格或者换行符为止;

下面的例子:

scanf("%d%d", &n, &m);
    gets(str);
    puts(str);
    return 0;

输出只有换行。

而下面的例子:

 scanf("%d%d", &n, &m);
    scanf("%s", str);
    puts(str);

运行结果,可知不会读入缓冲区的换行符:

根据王道得知 cin 与 cout 的效率要远远低于 scanf 以及 printf ,建议大家在刷计算机机试的时候最好使用 c 语言中的这两种方式,而且要注意的是 printf 和 cout 最好不要混用,很容易出错, 这里也做一个总结,方便大家熟悉 scanf 以及 printf 的使用方式,以及一些机试的输入格式技巧。

首先介绍一下,c 语言中的 <stdio.h> 表示 c语言标准输入输出函数库,包括了scanf 以及 printf ,在 c++ 中,stl 中有 <cstdio> 配合着 using namespace std 使用,这里建议使用 c++ 的方式,不容易产生误解。再有是<stdlib.h> 包含了 c 语言的标准库函数,包括了 free, malloc,relloc 等函数。

1. scanf 的用法:

首先先看一个例子,这个例子用于解决多组测试数据的 oj 问题:

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
using namespace std;

int main()
{
	int m,n;
	while (scanf("%d%d",&m, &n) != EOF)
	{
		printf("可以继续输入了!");
	}
	return 0;
}

eof 在stdio.h中定义,表示到达文件的尾部,正常这样写即可解决相应的 Oj 题目,在 windows 中手动输入 ctrl + z 可以使循环结束,但是实验了以下并不能在 vs 2015 中实现,可以用 ctrl + c 实现,或者输入多个ctrl + z 可以使得显示到达文件尾部并退出,具体的输出结果为:

2 3
可以继续输入了!3 2
可以继续输入了!
2
6
可以继续输入了!
^C请按任意键继续. . .

空格,回车在数字型变量中调试时都可以随意使用,包括 scanf(%d%d)两个 %d 之间可以加,也可以不加空格,没必要加,下面是王道机试对 eof 的一些解释:

如仍有测试数据未被测试完,那么该组测试的开头一行将如题面所说,为一个整数(n),其将会被scanf语句赋值给变n,那么scanf返回值为1,不等于EOF-1),循环条件成立,程序进入循环体,执行程序;如果输入已经到达结尾(输入文件到达末尾或在命令台输入中输入Ctrl+z),scanf函数无法再为变量n赋值,于是scanf函数返回EOF(end of file)

 对于字符如何输入输出字符串的 eof 的问题,这里我们先不解决,等遇到这样的问题时我们再回过头来解决吧。特别是 getchar(), 以及 putchar() 的问题,例如可以用getchar() 去接收空格或者回车字符。例如:scanf("%d",&n); getchar(); scanf("%c",&ch)中getchar()的作用就是接收空格或者回车符,确保 ch 是输入的期望字符。

看下面的这个例子:

scanf输入时,对于双精度浮点型,只能用%f, 但当用 printf 时,用%f 与 %lf 均可表示 double 型。下面的例子可以说明getchar() 在接收单个字符可以解决的问题,以及scanf中空格到底在什么时候起到作用的问题,要注意scanf 时要加上& ,而printf时则不需加上 & :

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<String>
using namespace std;

int main()
{
	double d;
	float f;
	int i;
	char ch;
	printf("请输入: ");
	//注意在%d前面也有一个空格,但是不影响,在输入时不必考虑
	scanf(" %d %f %lf %c",&i,&f,&d,&ch);
	printf("各个数分别为: %d %f %lf %c",i,f,d,ch);
	printf("\n");
	//考虑scanf 中空格的问题
	printf("请再次输入: ");
	scanf(" %d%f%lf %c", &i, &f, &d, &ch);
	printf("各个数分别为: %d %f %lf %c", i, f, d, ch);
	printf("\n");
	//将%lf 与 %c之间的空格去掉后就会出现问题
	printf("请再次输入: ");
	scanf(" %d %f %lf%c", &i, &f, &d, &ch);
	printf("各个数分别为: %d %f %lf %c", i, f, d, ch);

	return 0;
}

输出结果:

请输入: 1 1.0 1.0 c
各个数分别为: 1 1.000000 1.000000 c
请再次输入: 1 1.0 1.0 c
各个数分别为: 1 1.000000 1.000000 c
请再次输入: 1 1.0 1.0
各个数分别为: 1 1.000000 1.000000
请按任意键继续. . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值