Re: [問題] 奇怪的c問題

看板Electronics作者 (哆啦A孟)時間19年前 (2007/03/02 21:55), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串3/3 (看更多)
感謝z大大 我也有想過是因為enter也屬於一個輸入位元的關係 不過我有疑問的地方是 我第二個getchar並不是跟第一個是緊密接在一起的 而是經由一個副函數呼叫返回之後才又回到第二個getchar so , 如果是按照上面的解釋來說的話 那經由鍵盤輸入並且按下enter之後,這些位元是會先存到某個暫存空間囉 然後再丟給getchar, 然後第一個getchar處理第一個位元 接著副函數返回之後, 第二個getchar經由暫存空間讀到之前所輸入的enter位元. 我有試過假設在第二個getchar之後在加一個getchar , 然後假如我再第一個 getchar的時候是輸入兩個位元再按enter的話 , 那程式的確也會直接結束 並且結束前會輸出我再第一個getchar所輸入的第二個位元. 所以...應該是有一個暫存空間,去供getchar讀取資料吧. 我想 以上 請各位評評理 謝謝 PS:My system is linux system too. ※ 引述《zxvc (zxvc)》之銘言: : ※ 引述《adddream (哆啦A孟)》之銘言: : : int main(void) : : { : : int fd; : : fd=open("hello",O_RDWR | O_CREAT, 0666); : : if(fd<0) : : { : : perror("open"); : : exit(1); : : } : : lock_set(fd,F_WRLCK); : : getchar(); : : lock_set(fd,F_UNLCK); : : getchar(); : : close(fd); : : exit(0); : : } : 你可以試試看這個程式: : int main(void) : { : getchar(); : getchar(); : return 0; : } : 可以得到一樣的效果。 : 這是因為getchar()只會讀取一個字元。 : 你如果執行這個程式,輸入一個字元a、『再按Enter』, : 等於輸入兩個字元,因為按下Enter會輸入一個『newline』。 : 所以第二個getchar就會因為讀到newline而結束。 : 我在Linux上測試是如此, : 但是好像Windows上『newline』好像佔兩個字元,不清楚, : 你可以用3個getchar測試看看。 : : 如上程式,理想的情形應該是,在呼叫lock_set(fd,F_WRLCK)完之後,會因為getchar() : : 而等待輸入,輸入完之後街著呼叫lock_set(fd,F_UNLCK),然後在接著由於getchar() : : 而等待輸入,然後停止。 : : 但我試驗完之後,發現在呼叫完lock_set(fd,F_UNLCK)之後,程式就停了 =.=。 : : 也就是,第二個getchar()沒有作用。 : : 但若此時,我在第二個getchar()在加入一個getchar()之後,成式就可以等待輸入了。 : : but,只會停一次 =.=。意思是說,第一個getchar()不知道那去了。 : : 請問這是為捨壓 ??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.76.156 ※ 編輯: adddream 來自: 203.70.76.156 (03/02 21:56)

03/02 22:18, , 1F
對,你輸入的字串會被放在記憶體中的緩衝區.如果某個getchar
03/02 22:18, 1F

03/02 22:19, , 2F
沒有把緩衝區的資料讀完,就由下一個getchar去讀.
03/02 22:19, 2F
文章代碼(AID): #15w2pSPC (Electronics)
文章代碼(AID): #15w2pSPC (Electronics)