我自己学习C,作为练习我写了一个程序,但它不起作用。该计划分为3个部分。头文件,用于执行程序的主文件,用于定义函数的文件。我还没有使用所有的功能,但这应该不是问题。
这是我的头文件,没什么特别的。
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
struct Employee
{
char first[21];
char last[21];
char title[21];
int salary;
};
struct Employee* createEmployee(char*, char*, char*, int); // Creates a struct Employee object on the heap.
char* getfirstname (struct Employee*);
char* getlastname (struct Employee*);
char* gettitle (struct Employee*);
int getsalary (struct Employee*);
void setfirstname (struct Employee*, char*);
void setlastname (struct Employee*, char*);
void settitle (struct Employee*, char*);
void setsalary (struct Employee*, int);
void printEmployee(struct Employee*);
#endif
在此文件中,我定义了函数及其工作方式:
#include "7.1.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Employee* createEmployee(char* first, char* last, char* title, int salary) // Creates a struct Employee object on the heap.
{
struct Employee* p = (struct Employee*) malloc(sizeof(struct Employee));
if (p != NULL)
{
strcpy(p->first, first);
strcpy(p->last, last);
strcpy(p->title, title);
p->salary = salary;
}
return p;
}
char* getfirstname (struct Employee* p)
{
if (p != NULL)
return p ? p->first : "";
}
char* getlastname (struct Employee* p)
{
if (p != NULL)
return p ? p->last : "";
}
char* gettitle (struct Employee* p)
{
if (p != NULL)
return p ? p->title : "";
}
int getsalary (struct Employee* p)
{
if (p != NULL)
return p ? p->salary : 0;
}
void setfirstname (struct Employee* p, char* first)
{
if (p != NULL)
strcpy(p->first, first);
}
void setlastname (struct Employee* p, char* last)
{
if (p != NULL)
strcpy(p->last, last);
}
void settitle (struct Employee* p, char* title)
{
if (p != NULL)
strcpy(p->title, title);
}
void setsalary (struct Employee* p, char* salary)
{
if (p != NULL)
p->salary = salary;
}
void printEmployee(struct Employee* p)
{
if (p != NULL)
{
printf("%s, %s, %s, %d",
p->first,
p->last,
p->salary,
p->salary
);
}
}
最后一个文件用于执行程序/函数:
#include "7.1.h"
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char decision;
struct Employee emp;
struct Employee* emps[3];
for ( int i = 0; i < 1; i ++)
{
printf("Please type in the emplooyes data.\nFirstname:");
scanf("%s", emp.first);
printf("Lastname:");
scanf("%s", emp.last);
printf("Title:");
scanf("%s", emp.title);
printf("Salary:");
scanf("%d", &emp.salary);
emps[i] = createEmployee(emp.first, emp.last, emp.title, emp.salary);
}
printf("Do you want to print out your information? (Y/N):");
scanf("%c", &decision);
if (decision == 'y' || decision == 'Y')
{
printEmployee(emps[1]);
}
}
我不知道问题是什么。在第一次时间输入第一个,最后一个,标题和工资后,我总是收到以下错误消息。错误是用德语写的。这意味着:
7.1.exe中0x102de42e(msvcr100d.dll)的未处理异常:0xC0000005:写入0xCCCCCCCC位置时发生访问冲突。
我可以通过下面给出的提示修复第一个问题。现在,当我想使用函数printEmployee(emps[1]);
打印出员工数据时,我遇到了与访问冲突相同的错误。
答案 0 :(得分:3)
对于数字的scanf,您需要指定指向数字的指针而不是数字本身。即。
scanf("%d", &emp.salary);
可能还有其他问题,但这是我看到的第一个问题。
答案 1 :(得分:2)
您的printf()
参数可以查看:
printf("%s, %s, %s, %d",
p->first,
p->last,
p->salary, // did you mean title here rather than salary?
p->salary
);
此外,您还希望在格式字符串的末尾添加换行符:
printf("%s, %s, %s, %d\n", // note the \n
...
您的createEmployee()
定义也值得怀疑:
p->salary, salary; // did you mean p->salary = salary?
答案 2 :(得分:0)
这就是您致电scanf()
的方式:
scanf("%s", emp.salary);
这就是你应该拨打scanf()
的方式:
scanf("%s", &emp.salary); // note the address to the location you want
编辑:正如AlstairG指出的那样,你的字符串(char*
成员)是指针,因此已经有了地址。
答案 3 :(得分:0)
不知道,如果这是唯一的问题,但有一个问题是:
scanf(“%d”,emp.salary);
哪个错了(忘了带薪水的地址&amp;)
更好的尝试: scanf(“%d”,&amp; emp.salary);
++