2015-09-27 23 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

相关问题