C:使用“ scanf”读取一行其他字符内的浮点数

时间:2019-01-25 04:47:28

标签: c scanf getchar

我是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"

1 个答案:

答案 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