从 stdio 读取输入时不需要的空字符串
Unwanted empty strings when reading input from stdio
只是用简单的计算器做运动。我已经尝试 运行 提前并将其包装在 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!");
}
考虑 运行 的 'calculatro':
--- Welcome to calculatro ---
enter operator :
+
operator :+:
enter two values :
4 5
4+5=9
enter operator :
operator ::
empty op
enter operator :
- 用户输入一个运算符,在 stdio 上留下 '+\n'
- 您使用
readln
消耗所有 stdio
- 用户输入'45\n'作为操作数
- 您使用
readf
消耗 '4 5',在 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;
只是用简单的计算器做运动。我已经尝试 运行 提前并将其包装在 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!");
}
考虑 运行 的 'calculatro':
--- Welcome to calculatro ---
enter operator :
+
operator :+:
enter two values :
4 5
4+5=9
enter operator :
operator ::
empty op
enter operator :
- 用户输入一个运算符,在 stdio 上留下 '+\n'
- 您使用
readln
消耗所有 stdio - 用户输入'45\n'作为操作数
- 您使用
readf
消耗 '4 5',在 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;