C++从入门到成仙——5.输入输出

(如果没有账户而不能复制代码,请在上方地址栏前面加上“read:”打开阅读器模式)

一门编程语言肯定要有输入和输出。就好怕你需要吃饭和上厕所。

C++有许多的输入语句和输出语句,最基本的输入和输出的语句就是cin和cout。

1、语法结构——输出

下面是输入语句的结构:

cout<</*你想输出的内容*/; //cout在这里是输出语句

其中“<<”是重载运算符,把“<<”后面的内容全部打印到屏幕上,其中“cout”归属于“std”命名空间,来源于“iostream”头文件内。后面的“;”是该行程序运行结束的标识。如果想要换行,可以加上“\n”符号或者“<<endl”

而且你想输出多个内容时,可以写成一行,格式如下:

cout<</*a*/<</*b*/<<......<</*z*/<<endl;
cout<</*a*/<</*b*/<<......<</*z*/<<"\n";

输出效果:

/*a*//*b*/(这里省略/*c*/~/*y*/)/*z*/(换行)

但是要注意,不要把“<<”打成“<”,不然会引发一连串的编译错误。

举一些例子:

cout<<"Hello,"<<"world!";  //输出“Hello,world!”
cout<<"Hello,world!";  //输出“Hello,world!”
cout<<"Hello,"<<endl<<"world!"<<endl;  //输出“Hello,”换行world!”,换行
cout<<"Hello"<<" "<<"world"; //输出“Hello world”

因为“cout”归属于“std”命名空间内。如果没使用全局std命名空间,需要在cout和endl前加上“std::”,也就是:

std::cout<<"cout和endl归属于std!"<<std::endl;

2、语法结构——输入

输入语句和输出语句结构相似,但是必须要先定义一个变量把输入的值存进去。

结构如下:

cin>>/*变量*/; //cin在这里是输入语句

在这里,“>>”也是重载符,把cin读取到的内容全部存储到变量中,这里注意:读取的内容要与变量的类型相同,否则会发生隐式转换或者编译错误。

“cin”也来源于“iostream”头文件,归属于“std”命名空间,同样,如果没使用全局std命名空间,要在“cin”前加“std::”。你也可以一次读取多个内容并存储到变量中。

cin>>a>>b>>c>>d>>e; //依次读取内容到a b c d e,以空白字符作为结束符(多数为空格)

末尾也要加上“;”。也不要把“>>”打成“>”!

举个例子:

int n;
cin>>n; //把数据存储到n中。

3、特殊的输入输出语句

(1)getline

因为输入输出以空白字符(包括空格)为结束符,所以如果字符串中有空格就会截掉后面的部分。但是getline就可以很好的解决问题,因为它的结束符是换行(或者回车)。

string s;
cin>>s;
cout<<s<<endl;
//输入:Hello World
//输出:Hello
string s;
getline(cin,s); //第一个参数填cin,第二个参数填变量名
cout<<s<<endl;
//输入:Hello World
//输出:Hello World

注意:因为以换行为结束符,所以不能在“cin”后使用,因为每当“cin”读取数据的时候,我们一按回车(Enter),“cin”会把这个回车留在缓冲区,直到被“getline”读取,导致“getline”还没读取到数据,就提前结束。不过,我们可以用“cin.ignore()”来清除缓冲区,这样可以避免“getline”提前终止。

int n;
cin>>n;
string s;
getline(cin,s); //直接结束,s没有存储到任何值。

int n;
cin>>n;
cin.ignore(); //清空缓冲区。
string s;
getline(cin,s); //正确读取。

(2)scanf和printf

这2个语句是C语言的格式化输出,运行速度比C++的cin和cout快,但是并没有cin和cout安全。来源于头文件“cstdio”中,归属于“std”命名空间,但是允许不引用“using namespace std;”或者“std::”。但是标准要求还是要引用的。

scanf()是输入语句,它有2个及以上的参数,第一个参数必须是格式字符串!这些字符串我放到附录里了。然后就是变量名,变量名前必须加上“&”符号,意思是取地址,因为scanf要修改变量,需要访问变量的地址,如果不写“&”符号,编译器会误认为这个变量就是地址,可能会引发未定义行为(运行时错误)。

而且scanf的格式化字符串要和变量类型一致,不然可能会出现运行时错误、输出垃圾值……(内存中的无效值)导致后面的运算全部出错。

举个例子:

int a;double b;
scanf("%d%f",&a,&b); //必须取地址,一个格式字符串用“%”开头

而printf()是输出语句,它和scanf极其相似,只不过,它可以只要1个参数。也来源于头文件“cstdio”,归属于“std”命名空间。

它的第一个参数是格式化符号或者是字符串,也可以混合使用。如果有格式化符号,后面就要有匹配的变量类型。变量类型不匹配也会运行时错误或者输出乱码。要换行时在想换行的地方加“\n”。

printf("Hello\nWorld%d%d",a,b); //假设a=3,b=5
//输出
//Hello
//World35

此时你会问:“如果想输出%该怎么办?”在这里,我们可以这么写“%%”,因为%作为格式化符号具有转义的本领,类似于“\”转义。

printf("平均分:%d%%",a); //a=85
//输出:
//平均分:85%

4、总结

我们学习的输入输出语句主要有cout、cin、scanf、printf。其中cout和cin更安全,来自C++,scanf和printf速度更快,来自C

5、习题(满分100分)

一、简答题(25分,每题5分,一共5题)

1、请简要说明cout、cin、printf、scanf的区别。

2、cout和cin归属于哪个命名空间?

3、请简要说明cout、cin的用法。

4、请简要说明printf、scanf的用法。

5、为什么用scanf读取数据时需要在变量名前面加“&”?

二、编程题(75分,每题25分,一共3题)

1、请分别用cout和printf输出“Hello, World!”,并均有换行(引号内的内容)

2、请分别用cin读取整形数据到a,用scanf读取双精度浮点数据到b,并全部用cout输出,用空格隔开。(换行可选)

3、(选做)请用getline读取整型并用printf输出。

6、参考答案(写完之后再看!)

一、1、cout和cin归属于iostream头文件,而printf和scanf归属于cstdio头文件(答案不唯一)

2、cout和cin归属于std命名空间

3、cout用于输出,使用“<<”连接多个输出内容,自动识别类型,cin用于输入,使用“>>”连接多个输入内容,自动类型转换(答案不唯一)

4、printf用于格式化输出,需要格式符指定数据类型,scanf用于格式化输入,需要格式符匹配数据类型,变量前面加“&”取地址(答案不唯一)

5、因为需要取变量地址

二、1、

#include<iostream>
#include<cstdio> //C语言IO库
using namespace std;
int main(){
    cout<<"Hello,World!"<<endl;
    printf("Hello,World!\n");
    return 0;
}

2、

#include<iostream>
#include<cstdio> //C语言IO库
using namespace std;
int main(){
    int a;
    double b;
    cin>>a;
    scanf("%f",&b);
    cout<<a<<" "<<b;
    return 0;
}

3、

#include<iostream>
#include<string> //字符串库
#include<cstdio> //C语言IO库
using namespace std;
int main(){
    string a;
    getline(cin,a);
    int num=stoi(a); //字符串转整形
    printf("%d",num);
    return 0;
}

7、附录

C/C++格式化字符表
格式符数据类型示例说明
%dintprintf("%d",100);十进制整数
%ffloatprintf("%f",3.14);浮点数(默认6位)
%lfdoublescanf("%lf",&d);双精度浮点数
%ccharprintf("%c",'A');单个字符
%schar数组/stringprintf("%s","hi");字符串
%p指针printf("%p",&x);指针地址

8、后记

希望本篇文章对小白有帮助,如果有错误,欢迎大佬来纠错!

如果作者写得好,收藏一下吧,未免以后用得着呢?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值