设为首页收藏本站
查看: 168|回复: 1

2.《剑指C++》之从C到C++(2)

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:01
  • 签到天数: 760 天

    [LV.10]以坛为家III

    发表于 2020-6-8 11:38:30 | 显示全部楼层 |阅读模式
    本帖最后由 御天行 于 2020-6-10 10:11 编辑

    ======《剑指C++系列》:总目录======

    本讲主要介绍标准输入与输出
    1.cin标准输入
    数据传输的过程,就像流水一样从一个地方流动到另一个地方。因此,在C++中,将此过程称为“流(stream)"。在C++的标准库里,将用于进行数据输入输出的类统称为”流类“。要使用流类,需要在程序中包含头文件iostream。其作用类似于C语言中的scanf函数和printf函数(不同之处在于,C语言中的标准输入实际上是通过调用函数来完成,而在C++中则是通过类对象来实现)
    实验1:scanfcin对比
    1.1charint型的混合输入
    1. #include<iostream>
    2. using namespace std;

    3. int main(void){

    4.     int a;
    5.     char b;

    6. #if 0
    7.     scanf("%d%c",&a,&b);
    8.     printf("a=%d, b=%c",a,b);

    9. #else
    10.     cin>>a>>b;
    11.     cout<<"a="<<a<<","<<"b="<<b<<endl;

    12. #endif
    13.     return 0;
    14. }
    复制代码


    运行结果:




    由结果可知,在输入一个int形变量后紧跟一个char型变量时,如果试图使用“空格”键使之分开,则scanf会认为“空格”即要输入的字符,而cin则不会。

    1.2输入的扩展string:更安全的输入字符串
    我们知道,在C语言中,对于字符串的处理,使用的是char数组,而一旦超过了char数组的大小,就会产生越界问题,scanf并没有对于这种越界进行有效的检验。因此,在C++中,引入了string,通过string进行输入,可以避免char数组输入越界问题。
    1. #include<iostream>
    2. using namespace std;

    3. int main(void){

    4. #if 0

    5.    char a[16];

    6.    printf("123456789ABCDEF\n");
    7.    scanf("%s",&a);
    8.    printf("%s",a);
    9. #else

    10.    string a;
    11.    cout<<"123456789ABCDEFG"<<endl;
    12.    cin>>a;
    13.    cout<<a<<endl;
    14.    
    15. #endif
    16.    
    17.     return 0;
    18. }
    复制代码


    运行结果如下:
    char数组段代码进行测试:

    实验现象:当输入的字符串超过了存储范围时,发生崩溃现象。
    使用string段代码进行测试:

    实验现象:即使输入的字符串很大,也不会崩溃。
    string可以容纳一个很大的范围(即使你从早上一直输到晚上,也不会发生崩溃),避免了越界的行为,使用起来比C语言中的char数组方便,因此,小编建议:关于字符串方面,能用string解决的问题,就不要使用char数组来解决。需要注意的是,如果输入的字符串中间有空格,string也会对其进行截断,只保留空格前面的内容。


    2.cout格式输出
    C 语言中 printf 拥有强大的格式化控制。C++中 cout 对象也是可以实现的,但略显复杂,(在做ACM题目时,一些关于输出的问题,可能使用cout无法解决)多数 C++程序员会在格式输出的时候选择 C 的方式。
    2.1进制输出
    在C++中引入了流算子的概念,后续章节会深入探讨,这里只需记忆一些常用的即可。
    1. #include<iostream>
    2. #include<iomanip>
    3. using namespace std;

    4. int main(void){

    5. int i=123;
    6. cout<<i<<endl;
    7. cout<<"dec:"<<dec<<i<<endl;    //十进制输出,   等价于printf("%d",i);
    8. cout<<"hex:"<<hex<<i<<endl;    //十六进制输出,等价于printf("%x",i);
    9. cout<<"oct:"<<oct<<i<<endl;    //八进制输出,    等价于printf("%o",i);

    10. //也可以通过setbase(b)设置输出的进制格式,b为设置的进制数,可以是(10、8、16),一次设置,在下面的输出中全部生效
    11. cout<<setbase(10)<<i<<endl;
    12. cout<<i<<endl;

    13.     return 0;
    14. }
    复制代码


    2.2域宽/对齐/填充
    控制域宽、对齐、填充的流算子,分别是 setiosflags(ios::left),setw(10),setfill('0'),
    其用法如下:
    1. #include<iostream>
    2. #include<iomanip>
    3. using namespace std;

    4. int main(void){

    5.     cout<<setw(10)<<123<<endl;              //setw(n)设置输出的域宽,为n个字符宽度
    6.     cout<<setw(10)<<setfill('*')<<123<<endl;               //setfill('c')如果输出的字符串不能占满输出宽度,则以()里的内容填充,'c'为填充的字符
    7.     cout<<setw(10)<<setfill('*')<<setiosflags(ios::left)<<123<<endl;        //setiosflags()设置对齐方式,括号内可以设置左对齐或者右对齐(默认左对齐)
    8.     cout<<setw(10)<<setfill('-')<<setiosflags(ios::right)<<123<<endl;     //setiosflags(ios::right),设置右对齐

    9.     return 0;
    10. }
    复制代码


    2.3设置浮点数精度
    采用流算子,setprecision 和 setiosflags 即可以实现输出浮点数的精度。格式如下:
    1. #include<iostream>
    2. #include<iomanip>
    3. using namespace std;

    4. int main(void){

    5.     float f=1.234;
    6.     cout<<"default:"<<f<<endl;
    7.     cout<<"format:"<<setprecision(2)<<setiosflags(ios::fixed)<<f<<endl;
    8.     cout<<"format:"<<setprecision(4)<<setiosflags(ios::fixed)<<f<<endl;

    9.     return 0;
    10. }
    复制代码


    关于setprecision 和 setiosflags流算子,已经超出了本章的研究范围,这里不再详细介绍,下面给出一张参考图,读者可自行延伸阅读。
    以下两张图片转自博客https://blog.csdn.net/qq_41631051/article/details/91448649

    setiosflags()算子


    上一篇:1.C++的类型增强
    下一篇:3.C++的函数重载机制

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2020-7-1 11:14:57 来自手机 | 显示全部楼层
    学习了 感谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /3 下一条

    红盟社区--中国红客联盟 

    Processed in 0.062207 second(s), 15 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表