有關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;