问题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
译者: 王刚 / 杨巨峰