問題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
譯者: 王剛 / 楊巨峯