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

iMPose27

我的任务是使用结构来获取有关员工的信息,并输出他们的薪水。

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

对不起,如果有人问。我对structs / pointer / etc还是很陌生,所以我怀疑这是一个简单的错误。只是没有跳到我身上。我浏览了前面的一些问题,但许多问题是针对特定情况的。

// 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;
}
马洪里·莫里安库默(Mahonri Moriancumer)

问题代码有几个问题...

1)

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

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

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

当然,这会引起另一个问题,即已经定义了一个“ int j”。摆脱它:

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;   
     }

然后,在return语句之前放置一个“ goto标签”:

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&McLovin所指出的),等等。

    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);

扰流板

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

导入json文件时出现Typescript编译器错误

在Eclipse中使用Ant时,运行javac.exe编译器消息时出现错误

尝试移动大位集时,GCC4.6出现段错误,这是编译器错误吗?

尝试在C#中创建基本编译器,但出现访问冲突错误

尝试实现访客设计模式时出现编译器错误

boost :: spirit-尝试编译最简单的代码时出现编译器错误

添加Firebase Admin SDK后进行编译时出现编译器错误(正在解决)

为什么在尝试此OpenGL教程时出现“ r300 FP:编译器错误:”?

编译Qt时出现编译器错误

尝试设置GNU C ++编译器,但是在尝试编译hello.cpp时出现一个我不明白的错误

II尝试使用其他方法设置值,但出现编译器错误

尝试运行以下程序时出现编译器错误

尝试创建菜单时出现编译器错误

构建CImg时出现致命错误(编译器限制)

尝试打印出向量内容时出现编译器错误

尝试使用boost :: spirit解析字符串中的一个整数时出现编译器错误

发布:准备时,javac出现了Maven编译器错误

存档时出现Swift编译器错误

尝试在Android Studio中安装按钮时出现编译器错误

代码在主方法中运行良好,但是当我尝试给出其自己的方法时,在调用该方法时,出现关于IOException的编译器错误

尝试使用random_device,mt19937和uniform_int_distribution时出现许多编译器错误

当我尝试使用递归打印 1-10 个数字时,mingw gcc 编译器给出了一个我无法理解的错误

声明数组时出现编译器错误:编译器无法对...不同的子表达式进行类型检查

为什么在尝试打印字符串返回时会出现编译器错误?

尝试构造 std::thread 时出现奇怪的编译器错误:

编译器错误消息:尝试在表格中显示上传的图像时出现 CS1061

程序适用于 onlineGDB 编译器,但使用 MinGW 编译时出现逻辑错误

将 uint64_t 转换为 struct 时出现编译器错误

尝试使用简单的 ASP.NET Core 网站 RenderPartialAsync 时出现编译器错误