【问题标题】:Code printing extra memory garbage代码打印额外的内存垃圾
【发布时间】:2016-01-10 01:08:31
【问题描述】:

此代码正在打印额外的内存垃圾。我该如何解决? 在这段代码中,我试图删除 10% 的价格(将由用户插入)。

if (value == 1){
    int price = 0;
    int price_final = (price - (price - 0.01);
    printf ("INSERT A PRICE >> ");
    scanf ("%d", &price);
    printf ("Final value %d", price_final);
}

【问题讨论】:

  • 由于缺少),此代码无法编译。
  • 这段代码试图对整数变量进行浮点运算 (- 0.01)。它还通过scanf() 读取用户输入,这是绑定 以便稍后将OP 返回给SO。 ;-)
  • 即使错误被修复,price_final的计算也不会处理用户输入的price
  • 发布minimal reproducible example!那不编译并且有相当多的缺陷。请先尝试自己运行您的代码。 “我的代码不起作用”是没有特定的问题陈述!

标签: c clang++


【解决方案1】:

这有很多问题。

第一:

int price_final = (price - (price - 0.01);

您正在对一个未定义的整数执行浮点运算。

第二:

您甚至在读入用户价格之前就已经在计算新价格。这很荒谬,price 将始终在您的代码中假定0

第三:

int price_final = (price - (price - 0.01);

缺少右括号')'

可能还有更多,但这三个是显而易见的。

【讨论】:

    【解决方案2】:

    在获得price 的值之前,您正在进行计算(int price_final = (price - (price - 0.01);。代码应该是这样的:

    if (value == 1) {
        float price = 0, price_final;
    
        printf ("INSERT A PRICE >> ");
        if (scanf ("%f", &price) == 0) {
            fprintf(stderr, "Invalid price");
            exit(EXIT_FAILURE);
        }
    
        price_final = price - (price - 0.01);
        printf ("Final value %f\n", price_final);
    }
    

    您还要从未定义的 int 中减去 float(0.01),因此我将这两个变量都更改为 float

    另外,我建议您先使用fgets 读取一行,然后使用sscanf 解析字符串:

    char line[100];
    fgets(line, 99, stdin);
    int price;
    
    if (sscanf(line, "%d", &price) == 0)
        handle error
    

    【讨论】:

    • 您发布的代码只会由于对 int 执行浮点操作而产生垃圾。这种行为是未定义的。
    【解决方案3】:

    您想移除 10% 的用户给定价格。所以你的计算是这样的 x=y-(y*0.1);其中 y 是给定价格,x 是新价格。 这是代码:

    if (value == 1) {
        float price = 0, price_final;
    
        printf ("INSERT A PRICE >> ");
        if (scanf ("%f", &price) == 0) {
            fprintf(stderr, "Invalid price");
            exit(EXIT_FAILURE);
        }
    
        price_final = price - (price * 0.1);
        printf ("Final value %f\n", price_final);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2023-03-25
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多