2015-09-27 26 views
1

只需用簡單的計算器進行練習。我嘗試着跑到前面,並將其封裝在do-while循環中。然後我有一個奇怪的行爲 - catchin每個新循環的空字符串。可以看到,在case ""的代碼部分。從stdio讀取輸入時不需要的空字符串

所以這個問題 - 正在發生什麼,以及如何處理它?

可以看到我的謙卑嘗試註釋行修復它在代碼:

import std.stdio; 
import std.string; 

void main() { 

    writefln("--- Welcome to calculatro %s ---", " "); 

    int exit = 0; 

    do { 


     string op; 
     double first; 
     double second; 

     writeln("enter operator :"); 
     op = chomp(readln()); 
     writeln("operator :",op,":"); 
     //readf(" %s/n", &op); 


     switch (op) { 

     case "add", "+": 
      writeln("enter two values :"); 
      //readf(" %s %s", &first, &second); 
      readf(" %s", &first); 
      readf(" %s", &second); 
      writefln("%s+%s=%s", first, second, first+second); 
      //writeln(first+second); 
      break; 

     case "minus", "-", "substract":  
      writeln("enter two values :"); 
      readf(" %s %s", &first, &second); 
      writefln("%s+%s=%s", first, second, first-second); 
      break;   

     case "exit": 
      exit = 1; 
      break; 

     case "": 
      writeln("empty op"); 
      break; 

     default: 
      writefln("i dont know op!"~op); 
      //writefln("%(%s%)", op); 
      //writefln("%s", op); 
      //throw new Exception(format("Unknown operation: %s", op)); 
      break; 
     }  
    } while (exit == 0); 

     writeln("good bye!"); 

} 

回答

7

考慮的「calculatro」運行:

--- Welcome to calculatro --- 
enter operator : 
+ 
operator :+: 
enter two values : 
4 5 
4+5=9 
enter operator : 
operator :: 
empty op 
enter operator : 
  1. 用戶輸入的操作,在stdio上留下'+ \ n'
  2. 您使用readln消耗所有stdio
  3. T他用戶輸入 '4 5 \ N' 作爲操作數
  4. 可以使用readf消耗 '4 5',留下 '\ N' 上的stdio
  5. 下一個循環,readln讀取來自標準輸入輸出
  6. 下一行已經有關於標準輸入輸出線,僅包括來自前
  7. 因爲readln能夠讀取一整行左側的「\ n」的,用戶不會從輸入
  8. 提示
  9. chomp刪除「\ n」,給你留下一個空字符串

這裏的一個快速解決方法是在獲得操作數來使用尾隨換行符後調用readln。例如:

case "add", "+": 
     writeln("enter two values :"); 
     //readf(" %s %s", &first, &second); 
     readf(" %s", &first); 
     readf(" %s", &second); 
     readln(); // <----- read trailing newline 
     writefln("%s+%s=%s", first, second, first+second); 
     //writeln(first+second); 
     break; 
+0

非常感謝您的詳細解釋! – Rijk

相關問題