1. 程式人生 > >有關scanf和cin輸入字元的問題, 還有gets()和getline()(總結一下scanf和cin使用時需要注意的事項)

有關scanf和cin輸入字元的問題, 還有gets()和getline()(總結一下scanf和cin使用時需要注意的事項)

雖然說早知道字串讀入可以有很多坑,但是總是記不住,今天就轉載儲存一下大佬的吧,需要再來看。

原文地址:https://www.cnblogs.com/qinduanyinghua/articles/5720591.html

今天刷題遇到的問題:定義一個6*5的字元陣列,用scanf一個一個的輸入字元。

for(int i = 0; i < 6; i++)

    for(int j = 0; j < 5; j++){

        scanf("%c", &a[i][j]);

    }

在介面上可以看到,當輸入了5*5時,就結束了,原來回車的換行符也被“吃”了,

同樣定義一個一維字元陣列,如果用scanf,當輸入完之後,如果按回車,換行符也會被“吃”。。。。很容易出現問題。

總結:

(1)

     1.1  scanf 輸入字元時,會將'\n'吸收

     1.2  scanf 輸入字串時,遇到空格或者回車就代表結束

            輸入一個字串,如果在這之前有空格或回車,空格和回車不會給字串。遇到下一個空格或回車才代表結束

     1.3  讀一行字元,可以用gets();

(2)

    cin用法很簡單,如果輸入的是一個字元,那麼,'\n'不會被吸收, 其他的情況和scanf差不多

(3)如果用gets()或者getline(),那麼它一遇到'\n'就結束,比如定義 char c; char s[10]; scanf("%c", &c);gets(s);printf("%c\n", c);printf("%s",s);

     如果一輸入一個字元想給c,然後回車在下一行輸入一行字串給s;那麼輸出的時候會發現,第一行是字元c,第二行是個空行, 游標在第三行;

分析:輸入的第一個字元給了c,然後回車'\n',這個回車代表了s是個空串(很神奇),同時,如果在輸入一個字元c之後,按兩個空格再加一個字元a再回車,那麼s包含的就是兩個空格字元加字元a,在結束

    還發現,如果定義 char c[10]; char s[10]; scanf("%s", c);gets(s);printf("%s\n", c);printf("%s",s);

輸入asd  SS

結果輸出的是

asd

__SS(前面有有兩個空格)

表明輸入asd加個空格表示c字串結束時,這個空格同時給了字串s。。。

(4)如果定義的是字元陣列 char c[10],那麼讀入一行只能用gets(),不能用getline();可以用cout輸出字元陣列,也可以用printf()輸出;

如果定義string s;

輸入不能用gets(),只能用getline();

輸出不能用printf(),只能用cout;