尝试从struct打印时编译器错误

时间:2014-07-19 02:30:26

标签: c struct compiler-errors printf member

我的任务是,使用结构,获取员工信息输入,并输出他们的工资。

它似乎运行正常,直到我结束并尝试printf()计算结果。编译器告诉我[Error] request for member '*' in something not a structure or union。 (将*替换为ID,name,grossPay,netPay。)

对不起,如果被问到;我还是结构/指针/等新手,所以我怀疑这是一个简单的错误。它只是没有跳出来对我说。我查看了之前的一些问题,但很多都是针对具体情况的。

// Matt Posey - PP #20

#include <stdio.h>

struct employee
{
    char ID[6];
    char name[20];
    float hours;
    float payRate;
    float grossPay;
    float netPay;   
};

int main()
{
    int j, i = 0;
    int employees;

    printf("This program computes pay.\n");

    printf("\nNumber of employees: ");
    scanf("%d", &employees);
    fseek(stdin,0,SEEK_END);

// Get data
    for (i = 0; i < employees; i++)
    {
        j = i; 
        struct employee j;

        printf("\nFor employee %d:", i+1);

        printf("\nID: ");
        gets(j.ID);
        fseek(stdin,0,SEEK_END);
        printf("Name: ");
        gets(j.name);
        fseek(stdin,0,SEEK_END);
        printf("Pay rate: ");
        scanf("%f", &j.payRate);
        fseek(stdin,0,SEEK_END);
        printf("Hours worked: ");
        scanf("%f", &j.hours);
        fseek(stdin,0,SEEK_END);

        j.grossPay = j.hours * j.payRate;

        if (j.hours > 40)
        {
            printf("Overtime!");
            float OT = (j.hours - 40) * (j.payRate * 0.5);
            j.grossPay += OT;
        }

        j.netPay = j.grossPay * 0.75;   

    }

// Output data

    printf("\n\nID     | Name                 | Gross Pay | Net Pay");
    printf("\n------ | -------------------- | --------- | -------");    

    for (i = 0; i < employees; i++)
    {   
        j = i;

        printf("\n%c | %c | $%7.2f | $%7.2f", j.ID, j.name, j.grossPay, j.netPay);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题代码的几个问题......

1)

// Get data
for (i = 0; i < employees; i++)
{
    j = i;
    struct employee j;

变量j仅在声明它的范围(即大括号)内可见。通过将其移至“main()&#39;”范围来解决此问题:

int main()
{
    int j, i = 0;
    int employees;
    struct employee j;

当然,这会导致另一个问题,那就是已经有了一个`int j&#39;定义。摆脱它:

int main()
{
    int i = 0;
    int employees;
    struct employee j;

2)接下来,您需要j成为可以容纳所有员工的阵列。不幸的是,您(在编译时)不知道用户需要多少员工。所以,只需创建一个指针,以便稍后分配一些内存:

int main()
{
    int i = 0;
    int employees;
    struct employee *j=NULL;

让用户指出有多少员工,然后为阵列分配足够的内存:

 printf("\nNumber of employees: ");
 scanf("%d", &employees);
 fseek(stdin,0,SEEK_END);

 j = malloc(employees * sizeof(*j));
 if(NULL == j)
     {
     fprintf(stdout, "malloc() failed.\n");
     goto CLEANUP;   
     }

然后,添加一个&#39; goto标签&#39;就在退货声明之前:

CLEANUP:


    return 0;
}

要使用malloc()功能,您必须包含另一个标头:

#include <stdio.h>
#include <stdlib.h>  /* Added for 'malloc()' */

3)现在摆脱j=i;的事情:

// Get data
    for (i = 0; i < employees; i++)
    {
       printf("\nFor employee %d:", i+1);

4)现在,在引用j的地方,引用它就像一个数组:

    printf("\nID: ");
    gets(j[i].ID);
    fseek(stdin,0,SEEK_END);
    printf("Name: ");
    gets(j[i].name);
    fseek(stdin,0,SEEK_END);
    printf("Pay rate: ");
    scanf("%f", &j[i].payRate);
    fseek(stdin,0,SEEK_END);
    printf("Hours worked: ");
    scanf("%f", &j[i].hours);
    fseek(stdin,0,SEEK_END);

    j[i].grossPay = j[i].hours * j[i].payRate;

    if (j[i].hours > 40)
    {
        printf("Overtime!");
        float OT = (j[i].hours - 40) * (j[i].payRate * 0.5);
        j[i].grossPay += OT;
    }

    j[i].netPay = j[i].grossPay * 0.75;

在这里:

    printf("\n%c | %c | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);

5)摆脱j = i;中的main()

for (i = 0; i < employees; i++)
{
    printf("\n%c | %c | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);
}

6)修复printf()格式字符串。它应该是打印字符串,而不是字符:

    printf("\n%s | %s | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);

现在代码正常运行。

但是,仍有一些代码存在风险。例如,应该使用fgets()(而不是gets())[如chris&amp;麦克劳文等等。

    printf("\nID: ");
    fgets(j[i].ID, sizeof(j[i].ID), stdin);
    fseek(stdin,0,SEEK_END);
    printf("Name: ");
    fgets(j[i].name, sizeof(j[i].name), stdin);

如果有一个结尾换行符,报告会更清晰:

    printf("\n");

CLEANUP:

    return 0;
}

如Ed Heal所示,不需要这条线:

fseek(stdin,0,SEEK_END);

SPOILER

答案 1 :(得分:0)

您使用了名称&#34;变量的名称&#34;两次。

首先你说那里有一个名为j的int,然后你留下一个名为struct employee的{​​{1}}。重命名其中一个。

j