最早学的是“cin>>…;”“cout<<…;”这样的输入输出流,但是再后来发现这个的速度实在是太慢了,于是就换用了C语言的"scanf"、"printf"进行输入输出,麻烦是麻烦了点,但是在时间上可以省很多。
好了,现在总结下用"scanf"、"printf"的注意事项【每一条都是眼泪啊】
这两个函数,都被定义在库"stdio.h"或者是"cstdio"里,所以在使用的时候应该先加上“#include <cstdio>”
Scanf:
scanf("格式控制",地址列表)
注意,这里说的是“地址列表”,并非是变量名,也就是说,要用的时候,要在变量名之前加上“&”符号
例如:“scanf("%d",&n);”
其中的 n 就是变量名,加上了“&”后就变成了地址列表了
如果想读入多个变量,就多加几个格式控制,地址列表就好了
例如:scanf("%d%d",&a,&b); 这是读入两个变量,输入如下图
char s[80];
scanf("%s",&s);
![对C++的输入输出研究 对C++的输入输出研究](http://img.ph.126.net/06LbeIphbG2Mfb7MYkpArA==/1068760486670725727.jpg)
但是我们“%[]”控制符来控制输入,这个参数的意义是读入一个字符集合。也就是说,放在[]里面的是一个集合,表示你的输入都在这个集合里,例如这个集合“%[A-Z]”就是只读入大写字母,一旦遇到不是大写的就停止读入,例如“输入:A3B 输出: A”
这样就实现了整行的输入输出了。
为什么说要怀念readln呢,因为想要输入一个换行符是很难得,于是想换行读入就要这样做了,这个是自己想的,没有经过实践考验,不过应该是没有问题的
scanf("%d%*[^\n]%d",&a,&b);
“%*”的意思是指读入这个数据,但是不显示,也就是说,忽略掉,解释下上面的语句,就是首先读入变量a,然后再忽略掉这行剩下的东西,再读入b,翻译成pascal,应该类似于"readln(a); read(b);"
我自己实验的效果是这样的
之所以这样写,其实是为了那些不想去用getline的人们【^_^比如说我】
当然,C是不兼容C++的,也就是说,这样是不能读入string类型的,只能用字符数组,不过,要是先把字符数组读进去,再赋值给string也是可以的,就像这样:
char a[100]; string s;
scanf("%s",buf);
s=a;
Printf:
这个的用法其实很简单,和scanf是一样的,但是不同的是
printf(格式控制,变量名)
也就是说,输出的时候变量名字前面就不用加入“&”了,同时有些技巧的东西,例如,在控制格式的时候,我们可以定义场宽,或者左右补空格,亦或是直接转换进制。
const int a=12;
const float c=12;
printf("a is %d\n",a); //普通输出
printf("a is =\n",a); //左补空格,直到长度为3位
printf("a is %x\n",a); //16进制输出
printf("c is %3.4f\n",c); //保留小数【不想左补空格可以直接写成 printf("c is %.4f\n",c); 】
嗯,关于Scanf和Printf的研究就这些,以后有新发现的话会继续补充,另如果有意见或建议请联系我哦
QQ:244249650
另外,再附上一个格式控制的表
%a,%A 读入一个浮点值(仅C99有效)
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x,%X 读入十六进制整数
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
另外,自己研究的有一个%I64d 这个是long long在windows下的输出用法,据说在linux下应该是%lld