【问题标题】:Double being returned as jumbled numbersDouble 作为混乱的数字返回
【发布时间】:2019-07-08 14:59:51
【问题描述】:

一般来说是编程新手,用 VisualStudio 在 C 中创建一个程序,它会从用户那里获取一个浮点数,如果它是负数则返回,然后将它作为整数获取,最后返回整数的第一个数字.代码如下所示:

double extractDigit1(x){
     double userFloatValue = x;
     (userFloatValue >= 0) ? printf(" %f is a positive value.", userFloatValue) :
                             printf(" %f is a negative value.", userFloatValue);
}

int main(){
     double userValue;
     scanf_s("%lf", &userValue);
     extractDigit1(userValue);
}

输入 1234.345 得到我:

"1202590843.000000 is a positive value."

代替:

"1234.345 is a positive value."

【问题讨论】:

  • 如果不指定函数参数的类型,则假定为int。您应该将您的功能更改为void extractDigit1(double x)
  • 我不确定double extractDigit1(x) 是否是您要写的,因为这里的x 将是一个整数。
  • @Jabberwocky 它是有效的 C89 垃圾......(减去包含)。唯一拥有scanf_s 的平台是... _________。
  • 尝试启用所有警告并阅读它们! ...在gcc 你可以使用:gcc -Wall source.c

标签: c


【解决方案1】:

根本问题是

  • double extractDigit1(x)不是正确的函数原型,应该是double extractDigit1(double x)

    根据你写的内容,x 被认为是int,它与其余代码不兼容。

注意

  • 你的函数什么都不返回,而它们的原型告诉你

    这是一种未定义的行为,可能导致任何事情

终于

  • 您使用scanf_s 函数,几乎与scanf 类似,但处理字符串的方式不同且便携性较差(请参阅Difference between scanf and scanf_s)。我建议你不要使用它。

更正的代码:

#include <stdio.h>

double extractDigit1(double x){
    double userFloatValue = x;
    (userFloatValue >= 0) ? 
        printf(" %f is a positive value.", userFloatValue) :
        printf(" %f is a negative value.", userFloatValue);
    return 0;
}

int main(){
   double userValue;
   scanf("%lf", &userValue);
   extractDigit1(userValue);
   return 0;
}

【讨论】:

  • 非常感谢您的成功。我会在 6 分钟内接受你的回答。
  • scanf_s 是一个微软函数,它接受的参数比scanf 多。在scanf_s 中,必须指定缓冲区大小以防止缓冲区溢出。所以函数是不可互换的。
  • IIRC,只有%[%c%s 等格式说明符才需要更多参数,对吧?在 OP 的情况下,scanf_s 有什么问题?
  • @Spikatrix 不是,我相信scanf_s 在所有情况下都需要缓冲区大小。根本错误只是定义为intx 变量,因为没有输入。也就是说,我不鼓励使用 scanf_s
  • 是的,但是您的回答表明这是一个问题“您将scanf_sscanf 混合在一起:您将第一个称为第二个”并不正确,因为OP 的@ 987654341@ 完全有效
【解决方案2】:
double userFloatValue = x;
int my_var = (int)userFloatValue ;
         (userFloatValue >= 0) ? printf(" %d is a positive value.",   my_var ) :
                                 printf(" %d is a negative value.",  my_var ) ;

使用 scanf 而不是 scanf_s scanf("%f", &a);

【讨论】:

  • 然后把它作为一个整数你不认为它应该是 int
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2020-10-20
相关资源
最近更新 更多