[問題] 一個簡單的程式

看板C_and_CPP (C/C++)作者 (hth9494)時間10年前 (2015/10/12 22:33), 編輯推噓4(5114)
留言20則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 我用的IDE是 DEV C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 不知道為什麼,輸入完數字後,卻不讓我輸入字元 餵入的資料(Input): 輸入一個整數後,再輸入一個字元 預期的正確結果(Expected Output): 把整數和字元印出來看 錯誤結果(Wrong Output): 但是只輸入完數字,程式就結束了,不讓我輸入字元 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> int main() { int n; printf("enter a number\n"); scanf("%d", &n); printf("%d\n", n); printf("enter a char\n"); char c; c = getchar(); printf("%c", c); system("pause"); return 0; } 補充說明(Supplement): 還沒執行前 http://imgur.com/tK6oylO
執行後輸入數字 http://imgur.com/KMPMNv0
程式卻結束了 http://imgur.com/r9SDVpA
明明編譯有過的說,小弟初學C語言,請各位大大解惑,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.92.137 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1444660392.A.FE0.html

10/12 22:39, , 1F
scanf 數字時不會吃掉在它後面那個不是數字的字
10/12 22:39, 1F

10/12 22:40, , 2F
你在數字後面敲的 Enter 也是一個字, 它被 getchar 抓走了
10/12 22:40, 2F

10/12 22:41, , 3F
那個字印出來的效果是換行 (其實就是 '\n')
10/12 22:41, 3F

10/12 22:45, , 4F
原來是這樣,謝謝這位大大,可是我不懂的地方是
10/12 22:45, 4F

10/12 22:46, , 5F
為什麼getchar執行的順序會那麼早,他明明被寫在printf
10/12 22:46, 5F

10/12 22:47, , 6F
之後,為什麼程式不會先印出數字,再讓我輸入字元呢
10/12 22:47, 6F

10/12 22:48, , 7F
還有我的程式該怎麼改才會達到我想要的效果呢
10/12 22:48, 7F

10/12 22:50, , 8F
就是可以讓我依序輸入數字和一個字元 例如y之類的
10/12 22:50, 8F

10/12 23:20, , 9F
實際上它確實是印出數字後再去讀字元的, 只是因為所有輸入
10/12 23:20, 9F

10/12 23:21, , 10F
會被系統先存在一個暫存區裡才給你讀, 才會造成這種現象
10/12 23:21, 10F

10/12 23:22, , 11F
這種問題只要你有單獨讀字元跟讀其他東西混著就會發生
10/12 23:22, 11F

10/12 23:22, , 12F
主要是因為讀字元不會跳過空白跟換行, 但讀其他東西會
10/12 23:22, 12F

10/12 23:23, , 13F
因此常見解法就是在讀字元之前先一直讀到換行發生為止
10/12 23:23, 13F

10/12 23:28, , 14F
找到一篇我以前回的文了: #1AYcSB6U 這篇就在講這回事
10/12 23:28, 14F

10/12 23:29, , 15F
我回的那篇文原文裡有個 FLUSH 巨集就是用來清除的
10/12 23:29, 15F

10/12 23:36, , 16F
在 getchar 前面用 scanf("%*[\n\r]"); 把換行讀掉試試看
10/12 23:36, 16F

10/13 00:41, , 17F
C語言自由度高,相對安全性弱,編譯過非正確執行的保證
10/13 00:41, 17F

10/13 01:16, , 18F
了解了,非常感謝!!!
10/13 01:16, 18F

10/13 18:22, , 19F
這標題不是違反版規了嗎
10/13 18:22, 19F

10/31 08:13, , 20F
加一個 scanf(" ");
10/31 08:13, 20F
文章代碼(AID): #1M6yIe_W (C_and_CPP)
文章代碼(AID): #1M6yIe_W (C_and_CPP)