当我第二次运行循环时,为什么这个程序会崩溃?

时间:2017-11-12 18:47:16

标签: c

尽我所能来解决这个谜题,我想我会失去理智!任何人都可以帮助理解为什么当我第二次运行循环时这个程序崩溃了吗?

我可以在交互式循环中运行一次,并将输入的值写入文件。但是,当我第二次尝试通过a循环时,程序会窒息。

// C Libraries Used

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

// Constant definitions

const float OTPAYFACTOR = 1.5;
const float REGWORKWKHRS = 40;
FILE *payfile;                // report file (for output)

// Variable declerations
char deptname [21];
char firstname [10];
char lastname [10];
char fullname [47];
float hrsworked;
float hrwage;
float reghrsworked;
float othrsworked;
float otwage;
float grosswage;
int count;
char again;

// Function Prototypes

//**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~
// M A I N   F U N C T I O N
//**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~**~~

int main (void){
    payfile = fopen("c:\\class\\mod6\\ethan-pay.txt","w");     // Open disk file
    printf("Mountain Pacific Corporation\nDepartment Salary Program\n\n");
    printf("Please enter the name of the department: ");
    scanf("%s", deptname);
    count = 0;    // Initialize this "counting" variable to zero to start
    printf("%s", deptname);
    printf("\n");
do {

      printf("Enter employee #%d: ", count+1);
      scanf("%s %s", firstname, lastname);
      fscanf(payfile,"%s %s", firstname, lastname);
      strcpy(fullname, firstname);
      strcat(fullname, " ");
      strcat(fullname, lastname);
      printf("Enter the hourly wage of %s: ", fullname);
      scanf("%f", &hrwage);
      fscanf(payfile,"%f", &hrwage);
      printf("Enter total number of hours: ");
      scanf("%f", &hrsworked);
      fscanf(payfile,"%f", &hrsworked);

    if (hrsworked <= REGWORKWKHRS){     //
        reghrsworked = hrsworked;
        othrsworked = 0;
        otwage = hrwage * OTPAYFACTOR;
        grosswage = hrwage*reghrsworked;
    }
        else{

            reghrsworked = REGWORKWKHRS;
            othrsworked = hrsworked - REGWORKWKHRS;
            otwage = hrwage * OTPAYFACTOR;
            grosswage = (reghrsworked * hrwage) + (othrsworked * otwage);
        }
       fprintf(payfile,"%-22s%0.1f ($%0.2f) %6.1f ($%0.2f) $%-4.2f\n", fullname, reghrsworked, hrwage, othrsworked, otwage, grosswage);
       printf("\nThank you. Process another employee? ");
       scanf ("%s", &again);
       printf("\n");

       count++; // Increment the counting variable


} while (again == 'Y'|| again == 'y' || again != 'N' && again != 'n');


      printf("End of processing.\n");

    fclose(payfile);
return 0;
}

1 个答案:

答案 0 :(得分:2)

我不明白你为什么要扫描你用来保存结果的文件:

scanf("%s %s", firstname, lastname);
fscanf(payfile,"%s %s", firstname, lastname);
// ...
scanf("%f", &hrwage);
fscanf(payfile,"%f", &hrwage);
// ...
scanf("%f", &hrsworked);
fscanf(payfile,"%f", &hrsworked);

你做了什么擦除以前的值。只需删除对fscanf()的所有电话。

我强烈建议您更改代码练习,全局应避免,只在需要时声明变量,不要忽略函数中的错误代码,提供scanf()最大大小它可以使用等...

示例可能并不完美:

#include <stdio.h>
#include <string.h>

#define OTPAYFACTOR 1.5
#define REGWORKWKHRS 40

int main(void) {
  printf("Mountain Pacific Corporation\nDepartment Salary Program\n\n"
         "Please enter the name of the department: ");
  char deptname[21];
  if (scanf("%20s", deptname) != 1) {
    return 1;
  }
  printf("%s\n", deptname);

  FILE *payfile = fopen("c:\\class\\mod6\\ethan-pay.txt", "w");
  if (!payfile) {
    return 1;
  }
  for (int count = 0;; count++) {
    printf("Enter employee #%d: ", count + 1);
    char firstname[10];
    char lastname[10];
    if (scanf("%9s %9s", firstname, lastname) != 2) {
      return 1;
    }
    char fullname[19];
    sprintf(fullname, "%s %s", firstname, lastname);
    printf("Enter the hourly wage of %s: ", fullname);
    float hrwage;
    if (scanf("%f", &hrwage) != 1) {
      return 1;
    }
    printf("Enter total number of hours: ");
    float hrsworked;
    if (scanf("%f", &hrsworked) != 1) {
      return 1;
    }
    if (hrsworked <= REGWORKWKHRS) {
      float reghrsworked = hrsworked;
      float othrsworked = 0;
      float otwage = hrwage * OTPAYFACTOR;
      float grosswage = hrwage * reghrsworked;
      fprintf(stdout, "%-22s%0.1f ($%0.2f) %6.1f ($%0.2f) $%-4.2f\n", fullname,
              reghrsworked, hrwage, othrsworked, otwage, grosswage);
    } else {
      float reghrsworked = REGWORKWKHRS;
      float othrsworked = hrsworked - REGWORKWKHRS;
      float otwage = hrwage * OTPAYFACTOR;
      float grosswage = (reghrsworked * hrwage) + (othrsworked * otwage);
      fprintf(stdout, "%-22s%0.1f ($%0.2f) %6.1f ($%0.2f) $%-4.2f\n", fullname,
              reghrsworked, hrwage, othrsworked, otwage, grosswage);
    }

    printf("\nThank you. Process another employee? ");
    char again;
    if (scanf(" %c", &again) != 1) {
      return 1;
    }
    if (again != 'Y' && again != 'y') {
      break;
    }
    printf("\n");
  }
  fclose(payfile);
  printf("End of processing.\n");
}

示例输入:

jurasickpark
sarah connor 5 42
y
bob lennon 9 12
n

输出文件:

sarah connor          40.0 ($5.00)    2.0 ($7.50) $215.00
bob lennon            12.0 ($9.00)    0.0 ($13.50) $108.00