C - 获取字符串检查并使其成为双倍

时间:2011-11-17 19:41:46

标签: c string error-handling double

double_q_CPUTime;
double temp;

printf("Please enter q: CPU Time: ");

scanf("%lf", &temp);

if(input_validator('a',temp) == 'T') {
    q_CPUTime = temp;
}
else {
    printf("Invalid input");
}

我无法解决如何处理上述代码的错误。我基本上想

  1. 提示用户输入
  2. 验证用户输入以查看是否仅包含1,2,3,4,5,6,7,8,9或。基本上要确保它是双重的
  3. 然后如果它是一个double我想将temp中的值保存为q_CPUTIME
  4. 如果它不是双倍,则向用户显示错误消息,说明"输入无效"
  5. 我希望循环直到用户输入有效的双精度。

    我已经尝试了很多方法,最重要的是我最好的尝试。我无法想出实现这一目标的方法。

    每次我尝试过,即使用户输入一个字符串,它也只会将一些奇怪的数字保存到双精度值中,导致我后来在程序中的计算中断或甚至C崩溃。

    对我上一篇关于这个主题的非常含糊的帖子表示抱歉。

    (我已经看过检查输入的每个字符,但后来又将问题转移到了双字符中)

3 个答案:

答案 0 :(得分:1)

只需检查scanf的返回值即可检测错误。

#include <stdio.h>

int main(int argc, char const* argv[])
{
        double input = 0.0;

        // scanf() returns the number of correctly read input items
        //In our case that's 1
        if (scanf("%lf", &input) == 1) {
                printf("%f", input);
        } else {
                printf("input error");
        }
        return 0;
}

答案 1 :(得分:1)

你应该使用strtod;它检查双溢出/下溢,如:

#include <errno.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

  double d;
  char *e,s[100];

  fgets(s,100,stdin); if( s[strlen(s)-1]=='\n' ) s[strlen(s)-1]=0;
  errno=0;
  d=strtod(s,&e);
  if( *e || errno==EINVAL || errno==ERANGE )
    puts("error");
  else
    printf("d=%f\n",d);

答案 2 :(得分:0)

在“请输入...”printf之后废弃所有内容。从用户读入一个字符串。使用strtod将其转换为double并检查它是否是有效的双字符串。