分类
Level1

scanf与printf

#include<iostream>   //头文件
using namespace std;
int main(){
    int a=3;  //整型
    float b=3.12345678;  //单精度浮点型
    double c=3.12345678;//双精度浮点型
    char d='y';   //字符型
    scanf("%d",&a);//注意:输入时变量前必须加&(取地址符)
    printf("%d\n",a);  
   
    printf("%f\n",b);
    printf("%lf\n",c);
    printf("%c\n",d);
    return 0;
}

之前主要学习了cin和cout输入输出,也可以使用scanf( )输入、printf( )输出。基本数据类型的scanf、printf格式如下:

数据类型格式符举例
int%dscanf(“%d”, &n); //输入
printf (“%d”,n); //输出
long long%lldscanf(“%lld”, &n);
printf(“%lld”, n);
float%fscanf(“%f”, &f);
printf( “%f”, f ); //默认保留6位小数
double%lfscanf(“%lf”, &d);
printf( “%lf”, d ); //用%f输出是一样的
char%cscanf(“%c\n”, &c); //’\n’表示回车换行
printf( “%c\n”, c );
char数组%sscanf(“%s”, str); //如char str[100]=”hello”;
printf(“%s”, str);
char数组也就是字符串,第六单元重点讲到。
%gfloat输出时,去除小数尾0
%lgdouble输出时,去除小数尾0
在scanf中,除了char数组,其他类型的变量都要在变量前加&,&是取地址运算符。

特别提醒:初学者特别容易在写scanf时漏写&,因此如果在输入数据后程序异常退出,或输出很奇怪的内容,要马上考虑是否在scanf中漏写了&。

所有输出的变量均可包含在一个字符串中:

#include<cstdio> 
using namespace std;
int main(){
    int a=3;
    float b=3.12345678;
    double c=3.12345678;
    char d='y';
    scanf("%d%f",&a,&b); //输入a、b,中间空格,%d和%f中间可省略空格
    //双引号里面是整个输出,%d,%f,%lf,%c分别为变量a,b,c,d占了个位置
    printf("int a=%d, float b=%f, double c=%lf, char d=%c.",a,b,c,d);

    int hh,mm,ss;
    //双引号里面是整个输入,只不过把数据换成换成对应的格式符而已
    scanf("%d:%d:%d",&hh,&mm,&ss); 
    return 0;
}

scanf的返回值:scanf的返回值是正确读取变量的个数。
对于scanf(“%d %d”, &a, &b);
如果输入1 2,正确读入两个变量,返回2。
如果输出1 -或- 1,正确读入1个变量,返回1。
注意:如果用%d读入字母,无法正确读入,输入流中会一直有该字母的信息,需要对输入流做清空后,再进行后面的输入。

getchar和putchar 在某些其他函数使用不便的场合可以用getchar输入字符。

char c1,c2;
c1=getchar();
getchar();  //中间有字符是不要的,多的,可以这么写
c2=getchar();
putchar(c1);
putchar(c2);

float, double等输出保留若干位小数时用:%.4f, %7lf

#include<cstdio> 
using namespace std;
int main(){

    float b=3.12345678;
    double c=3.12345678;
    //下面分别保留4位小数,7位小数输出
    printf("float b=%.4f, double c=%.7lf",b,c);
    return 0;
}

最小数字宽度:%8.3f, 表示这个浮点数的最小宽度为8,保留3位小数,当宽度不足时在前面补空格。

#include<cstdio> 
using namespace std;
int main(){
    int a=3;
    float b=3.12345678;
    double c=3.12345678;

    printf("int a=%4d, float b=%8.3f, double c=%6.7lf",a,b,c);
    return 0;
}

%-8.3f,表示最小宽度为8,保留3位小数,当宽度不足时在后面补上空格

#include<cstdio> 
using namespace std;
int main(){
    int a=3;
    float b=3.12345678;
    double c=3.12345678;
    printf("int a=%-4d, float b=%-8.3f, double c=%-6.7lf",a,b,c);
    return 0;
}

%08.3f, 表示最小宽度为8,保留3位小数,当宽度不足时在前面补上0

#include<cstdio> 
using namespace std;
int main(){
    int a=3;
    float b=3.12345678;
    double c=3.12345678;
    printf("int a=%04d, float b=%08.3f, double c=%06.7lf",a,b,c);
    return 0;
}

cin、cout与scanf、printf性能比较
在竞赛中,经常出现数据集超大造成TLE(运行超时)的情况。这时候大部分人认为这是cin的效率不及scanf,甚至还上升到C语言和C++语言的执行效率层面的争论。其实,这是C++为了兼容而采取的保守措施。
可以在IO之前将stdio解除绑定,这样做了之后要特别注意:不要同时混用cout和printf 之类。
在默认情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

#include <iostream>
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // 加上上面两句以后,再使用cin、cout与scanf、printf性能差不太多
    // 下面再写我们的代码
    int a;
    cin>>a;
    cout<<a<<'\n'; //换行用\n,不要用endl
    ... ...
}