从stdio读取输入时不需要的空字符串

Rij*_*ijk 1 d

只需用简单的计算器进行锻炼.我试图跑到前面,把它包裹在do-while循环中.然后我有一个奇怪的行为 - 在每个新循环上捕获空字符串.人们可以在case ""代码部分看到它.

那么问题 - 发生了什么以及如何处理它?

我可以看到我在代码中的注释行上修改它的谦虚尝试:

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!");

}
Run Code Online (Sandbox Code Playgroud)

rco*_*rre 7

考虑一下'calculatro':

---  Welcome to calculatro   ---
enter operator :
+
operator :+:
enter two values :
4 5
4+5=9
enter operator :
operator ::
empty op
enter operator :
Run Code Online (Sandbox Code Playgroud)
  1. 用户输入运算符,在stdio上保留"+ \n"
  2. readln用来消耗所有stdio
  3. 用户输入'4 5 \n'作为操作数
  4. 您使用readf'4 5',在stdio上留下'\n'
  5. 下一个循环,readln从stdio读取下一行
  6. stdio上已有一行,仅包含之前的'\n'左边
  7. 因为readln能够读取整行,所以不会从输​​入提示用户
  8. 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;
Run Code Online (Sandbox Code Playgroud)