首先解决一下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
请按任意键继续. . .