C++标准输入与输出,cin 标准输入,cout 格式输出【C++】(b)

标准输入与输出(Input&Output)

cin 和 cout 是 C++的标准输入和输出流对象。他们在头文件 iostream 中定义,其意 义作用类似于 C 语言中的 scanf 和 printf。
但是本质上scanf 和 printf与cin和cout是有区别的,scanf 和 printf是函数,cin和cout是类对象,现在我们不需要关系,就当作是同等低位。

#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
  return 0;
}

执行结果为:
在这里插入图片描述

cin 标准输入

在这里插入图片描述

cin代表键盘,>>在C语言中是右移运算符,在这里表示流输入运算符。但是我们说C++是完全兼容C语言的,那么会不会由冲突呢?当然是不会的,这就是一个运算符有多种表达语义,这种现象叫做运算符重载,重载之后会根据具体位置而定,例如跟在cin 之后就是流输入运算符。如果写成a>>b 那就表示右移运算符。

  cin >> a >> b >> c;

cin >> a;
cin >> b;
cin >> c;

写法是等价的。

输入中的空白字符

我们接下来看第一种情况:
在C语言中:

#include <stdio.h>


int main()
{
	int n;
	char m;
	scanf("%d%c", &n, &m);
	printf("n = %d ,m = %c\n",n,m);
	return 0;
}

执行结果为:
在这里插入图片描述
读者这里的输入12a之间是没有空格的,上面代码中scanf中的%d和%c之间是没有空格的。
我们再换另一种输入:
在这里插入图片描述

如果在输入的时候中间加上了空格那么a就读取不到了,读取到的就是空格符号。

扫描二维码关注公众号,回复: 9050647 查看本文章

我们对于代码进行修改:
#include <stdio.h>

int main()
{
int n;
char m;
scanf("%d %c", &n, &m);
printf(“n = %d ,m = %c\n”,n,m);
return 0;
}
上面代码中scanf中的%d和%c之间是有空格的。

那么我们再进行输入:

在这里插入图片描述

这个时候不管输入换行,空格,制表符都是没有问题的。

在C++里面我们进行查看:

#include <iostream>
using namespace std;
int main()
{
    int n;
    char m;
    cin >> n >> m;
    cout << "n = " << n << "m = " << m << endl;
    return 0;
}

执行结果为:

在这里插入图片描述

在这里插入图片描述

我们可以看到,在输入的时候这里不管加上空格,换行,还是制表符,或者什么都不加都是没有问题的。

字符串输入

在C语言中:

#include <stdio.h>

int main()
{
	char buf[10];
	//scanf("%s", buf);//不安全的用法
	//gets(buf);      //不安全的用法
	fgets(buf,10,stdin);  //安全的版本
	fputs(buf,stdout);   
	return 0;
}

执行结果为:
在这里插入图片描述

读取到的是123456789\0
那如果换到C++里面我们进行输入和输出:

#include <iostream>
using namespace std;

int main()
{
    char buf[10];
    //scanf("%s", buf);//不安全的用法
    //gets(buf);      //不安全的用法
    //fgets(buf, 10, stdin);  //安全的版本
    //fputs(buf, stdout);
    cin >> buf;
    cout << buf << endl;
    return 0;
}

当我们输入数据超过预定的个数时。
执行结果为:
在这里插入图片描述

所以这种输入也是不安全的。

我们使用cin类对象的成员函数进行解决:

#include <iostream>
using namespace std;

int main()
{
    char buf[10];
    //scanf("%s", buf);//不安全的用法
    //gets(buf);      //不安全的用法
    //fgets(buf, 10, stdin);  //安全的版本
    //fputs(buf, stdout);
    cin.getline(buf,10);
    cout << buf << endl;
    return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到正确读取到了前9个字符并且加上\0

我们再换一种写法:

#include <iostream>
using namespace std;

int main()
{
    string str;
    cin >> str;
    cout << str << endl;
    return 0;
}

执行结果为:
在这里插入图片描述

以上的字符串输入是不会出现安全问题的。但是大小不是无穷大的。

我们可以输出str大小:

#include <iostream>
using namespace std;

int main()
{
    string str;
    cin >> str;
cout << str <<str.max_size()<< endl;
    return 0;
}

执行结果为:

在这里插入图片描述

输出的abc后面的就是str的大小。

cout 格式输出

C 语言中 printf 拥有强大的格式化控制。C++中 cout 对象也是可以实现的,但略显复杂,多数 C++程序员会在格式输出的时候选择 C 的方式, C++是完全兼容 C 的。

进制输出

cout 中引用了流算子(dec/hex/oct)的概念,后续博客会有详细的说明。现在,读者将 其当成一种常规来识记即可。

#include <iostream>
using namespace std;


int main()
{
    int data = 1234;
    cout << data << endl;
    cout << hex<<data << endl;  //16进制输出
    cout << oct<< data << endl;  //8进制输出
    cout << data << endl;
    return 0;
}

执行结果为:

在这里插入图片描述

但是我们可以看到同样的

cout << data << endl;

在开始和最后的输出结果时不一样的。因为在最后的

  cout << data << endl;

前面输出的是8进制。

那么如果在最后一行还要输出十进制就要就行修改输出为10进制:

#include <iostream>
using namespace std;
int main()
{
    int data = 1234;
    cout << data << endl;
    cout << hex<<data << endl;  //16进制输出
    cout << oct<< data << endl;  //8进制输出
    cout << dec << data << endl;  //输出十进制
    return 0;
}

执行结果为:

在这里插入图片描述

域宽/对齐/填充

#include <iostream>
using namespace std;


int main()
{  
    float f = 1.234;
    cout << f << endl;
    return 0;
}

执行结果为:
在这里插入图片描述

如果我们没有设置,那么默认就是原来数据。

域宽

接下来我们进行域宽设置:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{  
    float f = 1.234;
    cout <<setw(10) <<f << endl;
    return 0;
}

执行结果为:

在这里插入图片描述

对齐

接下来我们进行左对齐设置:

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{  
    float f = 1.234;
    cout <<setw(10) <<setiosflags(ios::left)<<f <<"*******"<<endl;
    return 0;
}

执行结果为:
在这里插入图片描述
以上打印结果表示域宽为10并且左对齐。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{  
    float f = 1.234;
    cout <<"******"<<setw(10) <<setiosflags(ios::right)<<f <<"*******"<<endl;
    return 0;
}

执行结果为:
在这里插入图片描述

以上打印结果表示域宽为10并且左对齐。

填充

接下来如果我们要输出12:3:5

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{  
    float f = 1.234;
    cout <<"******"<<setw(10) <<setiosflags(ios::right)<<f <<"*******"<<endl;
    int a = 12;
    int b = 3;
    int c = 5; //输出12:03:05
    cout <<setw(2)<< a <<":"<< b <<":"<< c <<endl;
    return 0;
}

执行结果为:

在这里插入图片描述

我们可以看到这里的域宽设置有问题,3和5域宽为1。

在这设置域宽的时候要每一个输出的变量都要设置,我们进行代码修改:

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{  
    float f = 1.234;
    cout <<"******"<<setw(10) <<setiosflags(ios::right)<<f <<"*******"<<endl;
    int a = 12;
    int b = 3;
    int c = 5; //输出12:03:05
    cout <<setw(2)<< a <<":"<< setw(2) << b <<":"<< setw(2) << c <<endl;
    return 0;
}

执行结果为:
在这里插入图片描述

那么接下来我们进行填充:

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{  
    float f = 1.234;
    cout <<"******"<<setw(10) <<setiosflags(ios::right)<<f <<"*******"<<endl;
    int a = 12;
    int b = 3;
    int c = 5; //输出12:03:05
    cout <<setfill('0')<<setw(2)<< a <<":"<< setw(2) << b <<":"<< setw(2) << c <<endl;
    return 0;
}

执行结果为:
在这里插入图片描述

设置浮点数精度和有效数字

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    float f = 1.23456;
    cout << f << endl;
    cout <<"输出3位有效数字"<<setprecision(3)<< f << endl;//输出3位有效数字
    cout << "输出5位有效数字" << setprecision(5) << f << endl; //输出5位有效数字
    cout <<"输出2位小数"<<setprecision(2) <<setiosflags(ios::fixed) << f << endl;//输出2位小数
    return 0;
}

执行结果为:
在这里插入图片描述

发布了84 篇原创文章 · 获赞 71 · 访问量 8960

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104236244