【问题标题】:C - Getting string checking it and making it a doubleC - 获取字符串检查并使其成为双倍
【发布时间】:2011-11-17 19:41:46
【问题描述】:
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. 如果是双精度值,我想将 temp 中的保存值转换为 q_CPUTIME
  4. 如果不是双精度,则向用户显示一条错误消息,提示“输入无效”

我希望这个循环直到用户输入一个有效的双精度。

我已经尝试了很多方法,顶部的代码是我最好的尝试。我只是想不出一种方法来实现它。

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

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

(我检查了输入的每个字符,但在将其转换为双精度时遇到了问题)

【问题讨论】:

  • 你为什么要比较 input_validator 返回的 'T'?您是否使用“T”作为布尔真值的替代?
  • 是的,因为 c 没有布尔值,我认为这是最好的方法......
  • 您将'0' 排除在您的数字列表之外。你也忽略了科学记数法:1.2e34。但是您不能仅通过查看它包含的字符来验证表示双精度的字符串。 "123.456" 有效; "12.34.56" 不是。 strtod() 为您处理这一切;无需重新发明轮子。
  • @user983969:“c 没有布尔值”过于简单化了。您应该阅读comp.lang.c FAQ 的第 9 节。

标签: c string error-handling double


【解决方案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);

【讨论】:

  • 迄今为止的最佳答案,你能解释一下 *e 在做什么吗?我不明白其余的代码只是不明白为什么 char *e 是相关的?
  • *e 表示字符,其中 strtod 停止扫描。 *e 表示 *e!='\0' ,这意味着 strtod 没有在字符串的末尾停止,例如。在非数字字符上 -> 错误
【解决方案2】:

只需检查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;
}

【讨论】:

  • 我会用“if(scanf()==1)”而不是“if(scanf())”来明确比较预期要读取的字段数。
  • *scanf 系列函数的最大问题是,如果输入是语法上有效的数字,但不适合目标类型(例如 1.0e999999),则行为是不明确的。没有检测或处理数字溢出的机制。另一个问题是使用scanf() 从标准输入读取数字会留下输入中跟随的任何内容。如果您键入123.45 后跟Enter,则换行符将等待处理。至少可以解决这个问题。
  • 看第三个答案,我个人认为这是解决这个问题的最佳方法,你同意吗?
【解决方案3】:

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

【讨论】:

  • 你写了 strtof;你的意思是strtod(固定)。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2017-02-28
  • 2013-07-05
  • 2016-01-13
  • 2018-08-30
相关资源
最近更新 更多