2017-09-26 64 views
1
  • 列表項

我有使用getchar() method.What我想是計算小組件模擬器與由用戶的形式ADD Rx Ry下寫入8個命令的問題其中RxRy是寄存器。我不允許使用字符串和數組,所以唯一的選擇是通過char讀取char。的getchar()函數奇怪

我的問題是,我不知道如何從輸入一行文本讀取多個字符,並把它放在variables.For例如,ADD Rx Ry我想存儲在ch1ADch2Dch3然後跳過空間驗證R並將x存儲在一個變量中,然後y的值相同。

奇怪的是,當我輸入初始一個之後的第二命令,即顯示在下面的程序只是將不會顯示完全相同的打印的值(打印僅僅是用於調試)

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
+0

你給什麼輸入?它是否包含換行符?你讀過換行嗎?你期望輸出什麼?你會得到什麼輸出? –

+0

你也必須閱讀換行符。 –

回答

0

當用戶鍵入 「通過增加RX RY」,他會敲回車。

getchar()一次只消耗一個字符。

所以,爲了消耗這個輸入,你需要調用getchar() 8次,3用於「ADD」,2用於空白,4用於寄存器。

現在你想輸入「ADD Ri Rj」,所以你認爲你需要再次撥打getchar() 8次。

getchar()的第一個調用將消耗前一個輸入的尾隨換行符(當用戶點擊Enter時)!它不會像你所希望的那樣消耗「A」。

因此,當鍵入「END」時,會有getchar()將消耗的以前輸入(如果有)的尾部換行符和字符。

所以,僅僅消耗其後的換行符(並繼續你的循環,因爲你不想處理換行符,只是使用它),這樣的:

do { 
    ch1 = getchar(); 
    if(ch1 == '\n') 
    continue; 
    ch2 = getchar(); 
    if(ch2 == '\n') 
    continue; 
    ch3 = getchar(); 
    if(ch3 == '\n') 
    continue; 
    ch4 = getchar(); 
    if(ch4 == '\n') 
    continue; 

    if(ch1=='E' && ch2=='N'&& ch3=='D') { 
    break; 
    } 
} while(1); 
0

你也必須閱讀換行符。另外,掃描後,您必須刷新stdin以刪除任何多餘的輸出。如果你不能使用字符串和數組,並且唯一的選擇是使用getchar,你將不會手動管理4個字符的緩衝區,這不會很漂亮。

  1. 用戶輸入ADD\n(4個字符):

    char ch1, ch2, ch3, ch4; 
    do { 
        ch1 = getchar(); if (ch1 == '\n') continue; 
        ch2 = getchar(); if (ch2 == '\n') continue; 
        ch3 = getchar(); if (ch3 == '\n') continue; 
        ch4 = getchar(); if (ch4 != '\n') continue; 
        if (ch1 == 'E' && ch2 == 'N' && ch3 == 'D' && ch4 == '\n') break; 
    } while (1); 
    

    ,當你不考慮換行和沖洗stdin這是會發生什麼。

  2. ADD被掃描時,ch1包含'A'ch2包含'D'ch3包含'D''\n'留在stdin中。
  3. 下一次迭代來了。用戶再次輸入ADD\n
  4. 然而,'\n'從以前的掃描中stdin離開,所以ch1包含'\n'ch2包含'A'ch3包含'D'並有D\n剩餘的stdin
+0

@Bob__和?我的代碼與OP代碼不相同,因爲OP的代碼已損壞。 – MarkWeston

0

當你開始輸入數據到終端中,說第一鍵入 「ADD \ n」 個,

  • A存儲在CH1
  • d被存儲在CH 2
  • d被存儲in ch3

並且'\ n'被髮送到緩衝區。現在你開始輸入新的字符集的第二次,說「SUB」的getchar()開始從緩衝區,它遇到的是「\ n」,所以第一個字符閱讀, 因此

  • CH1 = '\ n'
  • CH 2 = 'S'
  • CH3 = 'U'

更好的修復程序的一個問題是後所有三個的getchar()秒,將消耗添加一個的getchar()額外的'\ n'並且不會打印相同的內容。

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    getchar(); 

if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
return 0; 

}