我是C语言的新手,正在编写一个充当计算器的程序,其中输入代码的每一行均以运算符开头,然后包含潜在的空格,数字,更多潜在的空格和换行符。指示我使用getchar
读取浮点数以外的所有内容,并使用scanf
读取浮点数。
我不确定如何使用scanf
来读取混合在一行其他字符中的浮点数。以下代码显示了大多数while循环,其中还包括其余字符的读取,但最相关的部分是最后3行。
while (1) {
int ic = getchar();
if (ic < 0)
break; //EOF
char temp = (char) ic;
if (temp == '+' || temp == '-' || temp == '*' || temp == '/' ||
temp == '=' || temp == 'C' || temp == 'Q'){
op = (char) ic;
}
if (temp >= '0' && temp <= '9'){
char valu = scanf("%c", &temp);
val = (double) valu;
...
我希望读取输入行中的值,但是当我打印它时,它始终显示为"1.0000"
。
答案 0 :(得分:2)
逐步
我建议不要忽略良好的错误检查。假设用户输入可能是意外的。
每行输入代码均以运算符开头
很像OP的代码
int ic = getchar();
if (ic == '+' || ic == '-' || ic == '*' || ic == '/' || ic == '=' || ic == 'C' ||ic == 'Q'){
op = (char) ic;
} else (ic == EOF) {
break; //EOF
} else {
fprintf(stderr, "Unexpected input %d\n", ic);
break;
}
然后包含潜在的空格
使用isspace()
测试空格。
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
一个数字
请确保检查scanf()
返回值。关于"%f"
的关键属性是它占用了前导空格,包括'\n'
。要检测数字之前的'\n'
,有用的isspace()
循环很有用。现在代码知道要读取的第一个字符是不是任何空格。
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
更多潜在的空白和换行符。
请记住,'\n'
也是一个空格。
while ((ic = getchar()) != '\n' && isspace(ic)) {
;
}
if (ic != '\n') {
fprintf(stderr, "Unexpected trailing text %d\n", ic);
break;
}
// Success
当代码未成功执行时,代码应在尝试解析新的一行之前消耗掉所有输入,直到'\n'
或EOF
。