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

从stdio读取输入时不需要的空字符串,d,D,只是用简单的计算器做练习。我试着跑在前面,并将其包装在do while循环中。然后我有一个奇怪的行为——在每个新循环中捕捉空字符串。我们可以在案例“代码部分看到 那么问题是——到底发生了什么以及如何应对 你可以看到我在代码中注释行上修复它的拙劣尝试: import std.stdio; import std.string; void main() { writefln("--- Welcome to calculatro %s ---", " "); int exit =

只是用简单的计算器做练习。我试着跑在前面,并将其包装在do while循环中。然后我有一个奇怪的行为——在每个新循环中捕捉空字符串。我们可以在
案例“
代码部分看到

那么问题是——到底发生了什么以及如何应对

你可以看到我在代码中注释行上修复它的拙劣尝试:

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

}

考虑运行“calculatro”:

---  Welcome to calculatro   ---
enter operator :
+
operator :+:
enter two values :
4 5
4+5=9
enter operator :
operator ::
empty op
enter operator :
  • 用户输入一个运算符,将“+\n”留在stdio上
  • 您可以使用
    readln
    来消费所有的stdio
  • 用户输入“4\n”作为操作数
  • 您使用
    readf
    消费'45',在stdio上留下'\n'
  • 下一个循环,
    readln
    从stdio读取下一行
  • 在stdio上已经有一行,只由以前留下的“\n”组成
  • 由于
    readln
    能够读取整行,因此不会提示用户输入
  • 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;
    
    case“add”、“+”:
    writeln(“输入两个值:”);
    //readf(“%s%s”、&first和&second);
    readf(“%s”,第一个(&F);
    readf(“%s”,秒(&s));
    
    readln();// 考虑运行“calculatro”:

    ---  Welcome to calculatro   ---
    enter operator :
    +
    operator :+:
    enter two values :
    4 5
    4+5=9
    enter operator :
    operator ::
    empty op
    enter operator :
    
  • 用户输入一个运算符,将“+\n”留在stdio上
  • 您可以使用
    readln
    来消费所有的stdio
  • 用户输入“4\n”作为操作数
  • 您使用
    readf
    消费'45',在stdio上留下'\n'
  • 下一个循环,
    readln
    从stdio读取下一行
  • 在stdio上已经有一行,只由以前留下的“\n”组成
  • 由于
    readln
    能够读取整行,因此不会提示用户输入
  • 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;
    
    case“add”、“+”:
    writeln(“输入两个值:”);
    //readf(“%s%s”、&first和&second);
    readf(“%s”,第一个(&F);
    readf(“%s”,秒(&s));
    readln()//