[英]C: using “scanf” to read a float within a line of other characters
我是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"
。
一步步
我建议不要忽略良好的错误检查。 假设用户输入可能是意外的。
输入代码的每一行都以运算符开头
很像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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.