【问题标题】:Set struct array to blank/null instead of displaying 0 in C将结构数组设置为空白/空,而不是在 C 中显示 0
【发布时间】:2018-04-27 05:10:10
【问题描述】:

我正在编写一个简单的程序,用于记录员工的数据。 我有一个初始化为 null 的结构数组,但它显示“0”而不是空白。

我的代码:

#define SIZE 4
struct EmployeeData {
     int id;
     int age;
     double salary;
};

struct EmployeeData emp[SIZE] = { { { 0 } } };

[ ... ]

    case 4: // Remove Employee
        printf("Remove Employee\n");
        printf("===============\n");
        printf("Enter Employee ID: ");
        scanf("%d", &j);

        do {
            for (i = 0; i < SIZE; i++) {
                if (j == emp[i].id) {
                    printf("Employee %d will be removed\n", j);
                    emp[i].id = '\0';
                    emp[i].age = '\0';
                    emp[i].salary = '\0';
                    end = 1;
                }
            }
        } while (end != 1);
        break;

当我显示结构数组时,它会显示如下内容:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
   112       24    8999.99
   113       29    7999.99
   114       88    6999.99
     0        0       0.00

即使我删除/删除员工,它也只会将其替换为 0,而不是将其留空。因此,当我删除一个员工时,例如 id #113,我只希望它是这样的:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
   112       24    8999.99
   114       88    6999.99

代替:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
   112       24    8999.99
     0        0       0.00
   114       88    6999.99
     0        0       0.00

我已经尝试了我在网上看到的所有内容,但没有任何帮助。 提前谢谢!

【问题讨论】:

  • 您是否意识到通过编写emp[i].salary = '\0'; 您将这些值分配给0 而不是“空白”? intdouble 在 C 中没有“空白”表示。
  • 不要使用do/while,只要找到员工时添加break语句,如果可以假设没有重复条目。
  • C 中没有空白结构这样的东西,所以你不能这样做。相反,您必须决定如何在应用程序级别表示员工缺勤。
  • 请发布Minimal, Complete and Verifiable 示例。正如您所发布的那样,如果不解决问题,就不可能运行您的代码并进行检查。

标签: c


【解决方案1】:

您无法删除数组中的条目:数组大小设置为SIZE,因此您始终拥有SIZE 条目。

您可以为其中一个字段使用特定值来表示该条目无效或可用。 id 的值 0 似乎适用于此,因为它是未在初始化程序中明确指定的结构和数组元素的默认值,也是您删除代码设置的值。

只需在打印循环中测试此值并跳过这些记录。

第一个列表将变为:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
   112       24    8999.99
   113       29    7999.99
   114       88    6999.99

删除员工 id #113 的记录之后:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
   112       24    8999.99
   114       88    6999.99

【讨论】:

    【解决方案2】:

    你的数组是一个结构数组。在数组的每个元素中都有三个数值字段,它们设置为 '\0',即等于 0。我假设您正在使用一个简单的for 循环,该循环遍历数组的所有元素并打印出每个元素的每个字段。但是,由于您的字段是 intdouble,因此您正在使用的函数(可能类似于 printf("%d\t%d\t%f", emp[i].id, emp[i].age, emp[i].salary))。然后将您归零的字段转换为其字符表示形式,即“0”并打印到屏幕上。为了获得您想要的结果,最简单的方法是将 '\0' 更改为“非法值”,例如 -1。然后,您可以在每次尝试打印条目时检查该值。像if(emp[i].id == -1) continue; 这样的东西应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多