当我在这个程序中使用指针时为什么会出现垃圾? C语言

时间:2013-03-21 01:40:39

标签: c function pointers garbage

我是一名C ++程序员,试图掌握C语言的语法,我不明白为什么我在这个函数中使用指针时会得到垃圾值。

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

void separate(double, double *dollar, double *quarter, double *dime, double *nickle,  double *penny);
int
main(void)
{
double amount = 38.39, change, paid = 40.0, dollar, quarter, dime, nickle, penny;

change = paid - amount;
separate(change, &dollar, &quarter, &dime, &nickle, &penny);

printf("Your total change is: $%d\n", change);
printf("Dollars: %d\n", dollar);
printf("Quarters: %d\n", quarter);
printf("Dimes: %d\n", dime);
printf("Nickles: %d\n", nickle);
printf("Pennies: %d\n", penny);

getchar();
return (0);
}

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny)
{
double coins;
coins = change - floor(change);
*dollar = floor(change);
*quarter = coins / 25;
coins = coins - (*quarter * 25);
*dime = coins / 10;
coins = coins - (*dime * 10);
*nickle = coins / 5;
*penny = coins - (*nickle * 5);
}

4 个答案:

答案 0 :(得分:2)

您正在使用%d打印双打!尝试%f

printf("Your total change is: $%f\n", change);
printf("Dollars: %f\n", dollar);
printf("Quarters: %f\n", quarter);
printf("Dimes: %f\n", dime);
printf("Nickles: %f\n", nickle);
printf("Pennies: %f\n", penny);

答案 1 :(得分:1)

事实上。相反不直观,但printf语句中的%d用于整数。尝试使用%f打印浮点数字。

我还建议你看一下this

答案 2 :(得分:1)

您尝试使用%dprintf打印双变量,然后将double(或部分)的内存作为整数变量的内存,因为printf使用{ {1}}作为参数的指针,如果你指定了不合适的格式,arg点的类型也会出错。

将所有va_list替换为%d

答案 3 :(得分:1)

我怀疑你的问题是你没有正确分工。

看看:

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny)
{
    // for your example, change is initially 1.61
    double coins;
    coins = change - floor(change);  // .61
    *dollar = floor(change);         // 1
    *quarter = coins / 25;           // .0244
    coins = coins - (*quarter * 25); // 0
    *dime = coins / 10;              // 0
    coins = coins - (*dime * 10);    // 0
    *nickle = coins / 5;             // 0
    *penny = coins - (*nickle * 5);  // 0
}

整数除法和浮点除法的工作方式不同。你应该乘以100得到分数,除以25得到宿舍数,然后乘以得到一个整数。

*quarters = floor(coins * (100 / 25)); // floor(2.44) = 2
coins = coins - *quarters * 25;        // .11

根据需要重复以获得其他硬币的数量。

另外,其他人都提到你使用%d来打印双打而不是%f%d是一个整数格式的字符串)所以我也会提到它,因为这是问题的一部分。