代码执行中的第一个函数,但不执行第一个函数后面的代码

First function in code executing, but code following the first function is not executed

我的代码执行第一个函数,但不执行第一个函数之后的任何内容。我使用 gcc -o -Wall 编译并且没有收到任何错误消息。

当我尝试执行代码时,我在底部收到执行。我不确定为什么程序不会执行更多代码。在第一个函数中,我可以向该函数添加更多内容以使其正常工作,但它不会触及其他函数。

  1 #include <stdio.h>
  2 //functions prototypes
  3 void compute_discount(void);
  4 int print_results(void);
  5
  6
  7 //defined Gloabal var
  8 double Mdisc;
  9 double Cost_of_purchase;
 10 double DiscTot;
 11 double Sales_tax;
 12 double Total_price;
 13 char military;
 14
 15 int main (void) {
 16     //declare variables
 17
 18     //Cost of purchase
 19     printf("Cost of purchase?\t\t$");
 20     scanf ("%lf",&Cost_of_purchase);
 21
 22     //Military?
 23     printf("In military (y or n)?\t\t\n");
 24     scanf("%s",&military);
 25
 26 }
 27
 28
 29 //function to compute discount
 30 void compute_discount(void){
 31
 32     //compute military discount
 33     switch(military){
 34     case 'y':
 35     case 'Y':
 36         if(Cost_of_purchase > 150) {
 37             Mdisc = .15 * Cost_of_purchase;
 38         } else if (Cost_of_purchase < 150) {
 39             Mdisc = .10 * Cost_of_purchase;
 40         }
 41         break;
 42     case 'n':
 43     case 'N':
 44         Mdisc = 0;
 45         break;
 46     default:
 47         printf("Error:bad input");
 48 }
 49
 50     //cost minus military discount
 51     DiscTot = Cost_of_purchase - Mdisc;
 52     //sales tax
 53     Sales_tax = .05 * DiscTot;
 54     //Total Calculated
 55     Total_price = DiscTot + Sales_tax;
 56
 57     printf("maybe this is the problem%f",Mdisc);
 58 }
 59
 60 //function to print results
 61 int print_results(void){
 62
 63     //if input is n N y Y then use below, this is not dependant on if military only if the letter is accepted
 64     switch(military){
 65     case 'y':
 66     case 'Y':
 67     case 'n':
 68     case 'N':
 69         printf("Military discount (15%%): \t\t$%f", Mdisc);
 70         printf("Discounted total: \t\t$%f", DiscTot);
 71         printf("Sales tax (5%%): \t\t$%f", Sales_tax);
 72         printf("Total: \t\t$%f", Total_price);
 73         break;
 74 }
 75 return(0);
 76 }

执行结果:

[p18d541@csci112 lab1]$ gcc -o lab1 -Wall lab1.c
[p18d541@csci112 lab1]$ ./lab1
Cost of purchase?               0
In military (y or n)?
y
[p18d541@csci112 lab1]$

我想知道还需要做些什么来解决这个问题,或者我可以用什么方法让程序执行 int main() 以外的那些功能。

这一行:

scanf("%s",&military);

您传递的是单个 char 的地址。虽然 %s 格式说明符期望传递的是 char * 参数,但它还期望它指向数组的第一个字节,以便它可以存储字符串。因此,当只有一个字节可用时,该函数会尝试写入多个字节。超出对象边界的写入会触发 undefined behavior.

这可以通过使用用于读取单个 char%c 格式说明符来解决。您还需要在它之前添加一个 space 以使用先前 scanf 留在输入缓冲区中的换行符:

scanf(" %c",&military);

您也从未调用过 compute_discountprint_results,因此您需要在阅读用户输入后调用。

int main (void)
{
    printf("Cost of purchase?\t\t$");
    scanf ("%lf",&Cost_of_purchase);

    //Military?
    printf("In military (y or n)?\t\t\n");
    scanf(" %c",&military);

    compute_discount();
    print_results();
    return 0;
}

您定义了要使用的函数,但根本没有调用这些函数。想象一个场景,您想要定义一个函数来对两个数字 int aint b 求和,然后调用该函数来计算总和。它将是:

int sum(int a, int b) { 
    return a + b; 
}

int main() {
    int a = 5;
    int b = 10;

    printf("result: %d\n", sum(a, b));
    //                     ^^^^^^^^^
    //                     call sum function
}

意思是定义了函数之后,你需要使用它,所以你的main就是:

int main (void) {
    printf("Cost of purchase?\t\t$");
    scanf ("%lf",&Cost_of_purchase);
     
    printf("In military (y or n)?\t\t\n");
    scanf("%s",&military);

    // Finally call your defined functions:
    compute_discount();
    print_results();
}

其他函数(除了main)没有被执行,因为它们从未被调用过。 main 在您 运行 程序时自动调用,但必须显式调用任何其他函数。在第二个 scanf.

之后,在 main 底部添加对 compute_discountprint_results 的调用

顺便说一句,你的第二个 scanf 特别危险,因为你使用 "%s" 格式来读取单个字符......如果用户输入“是”会发生什么...... 'e' 和 's' 去哪儿了?