2017-03-17 40 views
-1

我正在嘗試爲某個東西創建一個模擬器,並且在處理器的主循環中,我想實現一個簡單的方法來一次一步地執行CPU一個循環通過按Enter輸入每個循環提示),以便我可以看到每個步驟正在執行的指令。此外,它允許您輸入一個數字,而不僅僅是Enter來將默認步長值從1更改爲其他值(因此它會跳過x個循環,然後一次返回1)。如果按Enter鍵,fgets()會忽略隨後的輸入

問題當我輸入一個數字時(跳過循環的數量,然後每個週期再次提示我),它可以正常工作,但是當我按Enter鍵而不是輸入數字時,我希望它默認爲1步,而是按Enter鍵它只是在整個程序運行而沒有再次提醒我。我如何進入== 1?

void CPU_loop() 
{ 
    ... 


    static int step = 1; 
    char cmd[10]; 
    if(step == 1) 
    { 
     if(fgets(cmd, 10, stdin) != NULL) // If you entered something other than Enter; doesn't work 
     { 
      step = std::atoi(cmd); // Set step amount to whatever you entered 
     } 
    } 
    else 
    { 
     --step; 
    } 

    ... 
} 
+0

僅有手動使用'getchar'標準輸入自己讀取輸入。只需將文本放入緩衝區,直到您收到換行符。然後你可以按照你的意願處理文本。 – bace1000

+0

按Enter鍵時'cmd'的值是多少?那麼「step」的價值是什麼? –

回答

1

當你按下直接輸入,它不會默認爲1,而是要傳遞的STR荷蘭國際集團"\n"std::atoi()std::atoi()不能被用來進行完整性檢查它的輸入,你可以使用一個不同的功能像std::strtol()或者,你可以簡單地添加

if (step == 0) 
    step = 1; 

因爲當,std::atoi()需要"\n"作爲輸入,它返回0。閱讀documentation以進一步瞭解它。

引用的文檔對應於成功str的內容

的整數值。如果轉換後的值超出了相應返回類型的範圍,則返回值未定義。 如果不能執行轉換,則返回0

還有一件事,你可以用C++的方式使用流輸入來避免所有這些。

+0

非常感謝!這工作完美。我一直認爲這個問題源於fgets而不是atoi。我希望我沒有浪費一個多小時試圖解決錯誤的問題! –

0

你可以這樣做:

if (fgets(cmd, 10, stdin) != NULL) 
{ 
    if (cmd[0] == '\n'){ 
     step = 1; 
    } 
    else{ 
     step = std::atoi(cmd); // Set step amount to whatever you entered 
    } 
} 
+0

對不起,如果按下ENTER,它會通過''\ n「'到'std :: atoi()'。 –

+0

我很抱歉。編輯。 – ChrisB