关于C艹中的笑脸问题。

问题1:
利用转义序列编写一段程序,要求先输出2M,然后换行;
修改程序,使其先输出2,再输出制表符(横向)再输出M,然后换行。

解:

#include <iostream>
int main()
{

    std::cout<< "2\115\n" <<std::endl;
        std::cout<< "2\t\115\n" <<std::endl;
    return 0;
}

运行结果:

这里写图片描述

之后,把程序作出修改:

#include<iostream>
int main()
{
    std::cout<< "\001\115\n" <<std::endl;
        std::cout<< "\001\t\115\n" <<std::endl;
    return 0;
}

运行结果:

这里写图片描述

我们可以看得出:
修改程序以后,结果变成了人脸;

这是因为,\001 是一个泛化的转义序列;
其形式是 \ 后面紧跟1个,2个或3个八进制数字。
如 \001 表示八进制 1;
或者是 \x 后紧跟1个或多个16进制数字;
而泛化的转义序列与制表符 ( \t 或 \v )用在一起 或 泛化的转义序列 单独用 就会这样出现人脸。

\001 == 半张人脸
\001\t == 一张人脸(因为运用了横向制表符)

再次修改程序 \t(横向制表符) -> \v (纵向制表符):

#include<iostream>
int main()
{

    std::cout<< "\001\115\n" <<std::endl;
        std::cout<< "\001\v\115\n" <<std::endl;
    return 0;
}

运行结果:

这里写图片描述

笑脸变成了不知名的符号。

由此可知,导致此问题的原因是字符集的问题。

扩展:
假设是用的是Latin-1字符集,以下是一些示例:

\7 (响铃) \12 (换行符) \40 (空格)
\0 (空字符) \115 (字符M) \x4d (字符M)

解决以上问题的办法是:
不使用泛化的转义序列:

#include<iostream>
int main()
{

    std::cout<< "2\115\n" <<std::endl;
        std::cout<< "2\t\115\n" <<std::endl;
    return 0;
}

运行结果:

这里写图片描述

完毕。

参考资料:
《C++ Primer 中文版(第 5 版)》【电子工业出版社】
作者: [美] Stanley B. Lippman / [美] Josée Lajoie / [美] Barbara E. Moo
译者: 王刚 / 杨巨峰

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值