使用C编程功能和结构,获得奇怪的输出,没有错误

时间:2010-11-23 20:42:57

标签: c

我正在学习一点C并且我正在进行练习,我使用结构和功能来收集员工信息并将其打印出来。 我正在声明标题中的函数和结构,因为我需要它们在其他两个文件中。

//employee.h

int addEmployee(void);
int printEmployee(int i);

struct employeelist 
{
    char last [20];
    char first[20];
    int pnumber;
    int salary;
};


“核心”文件正在执行这两个功能。第一个函数询问员工数量,并为收集和存储信息的第二个函数返回一个值。没有错误,我已多次检查代码。

//employee.c

#include "employee.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int numE;
int i;

int addEmployee(void)
{
    struct employeelist employee[5]; 
    int numE; 


    printf("How many employees do you want to add to the list?: ");
    scanf("%d", &numE);
    printf("Please type in the last name, the first name,\nthe personal number and the salary of your employees.\n");

    for (i=0; i < numE; i++)
    {

    printf("Last name: ");
    scanf("%s", employee[i].last);  

    printf("First name: ");
    scanf("%s", employee[i].first);  

    printf("Personal number: ");
    scanf("%d", &employee[i].pnumber);  

    printf("Salary: ");
    scanf("%d", &employee[i].salary);  
    }

    return numE;
}

int printEmployee(int emp)
{
    struct employeelist employee[5]; 
    for (i=0; i < emp; i++)
    {

        printf("Last name: {%s}\nFirst name: {%s}\nPersonal number: {%d}\nSalary: {%d}\n",employee[i].last,employee[i].first, employee[i].pnumber, employee[i].salary);
    }

    getchar();
    getchar();
    return emp;
}


最后一个文件包含执行上述功能的main()函数。

#include "employee.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int emp;

int main ()
{
    struct employeelist employee[5]; 
    int emp = addEmployee();
    printEmployee(emp);
    return 0;
}


现在我的问题是一切正常只有输出不正确。我甚至不能说它是什么。某种随机混合的标志,字母和数字。既然我不知道我的错误在哪里,我会很高兴有任何建议来解决这个问题。谢谢。alt text


我添加了输出的屏幕截图。也许有帮助。

6 个答案:

答案 0 :(得分:3)

您正在尝试使用局部变量,该函数在函数返回时不再存在。

int addEmployee(void)
{
    struct employeelist employee[5];
    /* ... */
}

变量employee仅存在于addEmployee()函数中;每次调用函数时它都是一个不同的对象。

int printEmployee(int emp)
{
    struct employeelist employee[5];
    /* ... */
}

employee与addEmployee中的//employee.h struct employeelist { char last [20]; char first[20]; int pnumber; int salary; }; /* add up to `maxemp` employees to the array and ** return number of employees added */ int addEmployee(struct employeelist *, int maxemp); /* print all employees from index 0 to (nemp - 1) */ int printEmployee(struct employeelist *, int nemp); 无关。


但是现在不要做容易的事(*); 做正确的事:在main()函数中声明数组并传递它。

#include "employee.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main ()
{
    int emp;

    struct employeelist employee[5]; 
    int emp = addEmployee(employee, 5);
    printEmployee(employee, emp);
    return 0;
}

在main()中声明一个数组,并将其传递给

{{1}}

(*)不要为员工声明全局变量


编辑employee.h并添加了main()函数

答案 1 :(得分:2)

您的打印功能中有一个全新的变量,甚至没有初始化。因此它只包含垃圾并打印

答案 2 :(得分:2)

问题的核心在于,您正在与三个不同的员工阵列合作,而不是您认为自己拥有的一个阵列。当程序在这些大括号内执行代码时,在C中的一对大括号内声明的任何内容仅“存在”。您已经在三个不同的代码块中声明了三个不同的雇员结构数组。

指向正确的方向(不管这是作业还是自学,这是一个学习练习所以只修复你的代码可能不是你想要的)你应该考虑如何通过< em>相同的员工阵列依次为您的每个功能。 (编辑:pmg打败了我。)

在你的main()函数中声明数组一次,并修改你的两个函数printEmployee()addEmployee()以将该数组作为参数而不是声明它们自己的本地阵列。

这是一个非常简单的示例,使用ints显示参数和返回值如何工作。你必须阅读有关指针的内容,以便将其扩展到你的案例中。

int main() {
    int number = 2;
    int newNumber;
    newNumber = timesTwo(number);
    printf("number: %d newNumber: %d", number, newNumber);
}

int timesTwo(int param) {
    return param * 2;
}

在开始分解文件并使用结构和指针之前,最好通过在单个文件中构建简单程序来练习函数,参数和变量的概念。

答案 3 :(得分:1)

您在本地向两个函数声明employee数组,因此它们无法访问彼此的数据。

答案 4 :(得分:1)

正如其他人已经说过的那样,主要问题是你在每个职能中声明struct employeelist employee[5]。这使得这些变量在其功能中是局部的,因此从一个功能到另一个功能是不可访问的。因此,当printEmployee进行打印时,它正在打印的数据是乱码。

需要解决一些问题:

  • 在您的主要(您已经拥有)中对您的员工列表进行一次声明,然后将其传递给函数。您需要通过数组名称进行传递,以便函数正确处理数组。
  • 由于上述原因,您需要将struct声明移动到函数原型之上,然后更改employee.h中的原型以适应employeeelist的传递。
  • 您必须检查用户是否尝试输入的数据超出数组的空间。或者,您可以在main中声明一个指针,并在addEmployee函数中malloc()声明所需的内存。

其他一些建议让你自己更轻松一些:

  • 调用您的结构employee(或类似内容)和您的数组employeelist(或类似内容)。
  • 在您的结构上使用typedef缩短&amp;简化你的声明。
  • 将printEmployee更改为void函数(即void返回类型)。

答案 5 :(得分:0)

看看..分布均匀,易于阅读,只需要一点点改进就可以变大,做你想做的工作。

typedef struct
{
  char last [20];
  char first[20];
  long int pnumber;
  int salary;
}employee;

  /* the two functions clearly declared */
  int addEmployee(employee const wEmployeeList[]);
  void printEmployee( employee const wEmployeeList[], int );

int main()
{
   int numberE;
   employee employeeList[2];
   numberE = addEmployee(employeeList);
   printEmployee(employeeList, numberE);

   return 0;
}
int addEmployee(employee const wEmployeeList[2]){

int i;
 for (i=0; i < 2; i++)
{

printf("Last name: ");
scanf("%s", wEmployeeList[i].last);

printf("First name: ");
scanf("%s", wEmployeeList[i].first);

printf("Personal number: ");
scanf("%ld", &wEmployeeList[i].pnumber);

printf("Salary: ");
scanf("%d", &wEmployeeList[i].salary);
}

return 2;
}


void printEmployee(employee const wEmployeeList[2], int numberEmployee){

int i;

for (i=0; i < numberEmployee; i++)
{

    printf("\n\nLast name: %s\nFirst name: %s\nPersonal number: {%ld}\nSalary: {%d}\n     \n",wEmployeeList[i].last,wEmployeeList[i].first, wEmployeeList[i].pnumber,    wEmployeeList[i].salary);
}


}