-1

我正在编写一个程序,根据他们的收入确定谁应该在家庭中支付什么。所需的行为如下:

  • 打印欢迎信息并询问家里有多少人。
  • 如果输入的数字是 10 或以下,请询问他们的姓名。
  • 询问每个人的收入。<-这就是问题所在
  • 显示总收入。
  • 计算并显示结果。

显然这个程序不完整,我需要阻止用户输入负值,但最大的问题是当用户输入每个人的收入时,在按下返回键时它不再要求用户输入并且 totalEarnings 出来了为 0。

我习惯用 C++ 编程,所以我希望我刚刚错过了 C 的一个怪癖。

主程序

#include <stdio.h>

int main(void){

    short numberOfPeople = 0;
    char* names[10] = {0,0,0,0,0,0,0,0,0,0};
    float earnings[10] = {0,0,0,0,0,0,0,0,0,0};
    float totalEarnings = 0;
    float bills = 0;

    printf("Welcome!\nThis program calculates who should pay what for the bills in a proportional manner, based upon each persons income.\nHow many people are in your household?\n\n");

    do {
        printf("You can enter up to 10: ");
        scanf("%d", &numberOfPeople);
    } while(numberOfPeople > 10);

    puts("");

    for(short j = 0; j < numberOfPeople; ++j){
        printf("What is person %d's name? ", j+1 );
        scanf(" %s", &names[j]);
    }

    puts("");   

    for(short i = 0; i < numberOfPeople; ++i){
        printf("How much did %s earn this month? ", &names[i]);
        scanf(" %.2f", &earnings[i]);       
        totalEarnings += earnings[i];
    }

    printf("\nTotal earnings are %.2f.\n\n", &totalEarnings);

    printf("How much are the shared bills in total? ");
    scanf(" %.2f", &bills);

    puts("");

    for(short k = 0; k < numberOfPeople; ++k){
        printf("%s should pay %.2f", &names[k], &bills); 
    }

    puts("");   

    return 0;
}
4

3 回答 3

3

您没有分配任何内存来保存名称,因此将它们扫描为空。

在这一点之后,所有赌注都取消了。

于 2013-10-18T22:48:49.943 回答
1

正如@LoztInSpace 指出的那样,names没有分配。

另一个错误是您在调用中使用&了运算符 with%s%f说明符。printf()它不会像预期的那样给出结果。另外,您的意图真的是一个询问“人数”的循环吗?

于 2013-10-18T22:55:07.200 回答
1

您在 printf 调用中遇到了额外&字符的问题,其他人已经注意到了这一点。

您报告的问题可能是由以下行引起的:

scanf(" %.2f", &earnings[i]);

问题是.在 scanf 格式中没有定义的含义(它可能被忽略,或者可能导致 scanf 调用失败。)将2输入限制为 2 个字符,因此如果任何人的收入超过 2 个字符就会失败位数。所以你需要摆脱那些,你真正需要的是检查 scanf 的返回值,看看它是否失败,如果失败,做一些适当的事情。就像是:

while (scanf("%f", &earnings[i]) != 1) {
    scanf("%*[^\n]"); /* throw away the rest of the line */
    printf("That doesn't look like a number, what did they earn this month? ");
}

应该对所有其他scanf调用执行类似的操作。

于 2013-10-18T23:01:54.073 回答