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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章