【问题标题】:c database program using structsc 使用结构的数据库程序
【发布时间】:2015-11-22 21:51:51
【问题描述】:

我正在用 c 语言制作一个使用结构显示数据库的程序,我对编程有点陌生,我也知道 c++,而且我也为 c++ 制作了程序,但我在这两个程序中都有问题。我只会发布c代码。所以程序运行良好,直到我看到没有打印我输入的值,它打印随机值(我猜这是垃圾内存)。我不知道为什么这是工作看看:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct database{
char dataname[32],date[32];
int  number_employers;
float  profit;
double salary;
}database;
void new_company(database x);
void show_company(database x);

int main()
{
database Tarom,Wizzair;
new_company(Tarom);
system("cls");
new_company(Wizzair);
system("cls");
show_company(Tarom);
show_company(Wizzair);
return 0;
}

void new_company(database x){
printf("Enter company name: ");
scanf("%s",&x.dataname);
printf("\nEnter company date: ");
scanf("%s",&x.date);
printf("\nEnter number of employers:");
scanf("%d",&x.number_employers);
printf("\nEnter the average salary of employers:");
scanf("%f",&x.salary);
printf("\nEnter the company profit(in proccent):");
scanf("%f",&x.profit);
}

void show_company(database y){
printf("Company name:%s\n",y.dataname);
printf("Company date:%s\n",y.date);
printf("Number of employers:%d\n",y.number_employers);
printf("Average salary of employers:%f\n",y.salary);
printf("Company profit:%f\n***************************\n",y.profit);
}

【问题讨论】:

  • 欢迎来到 StackOverflow。只是问“请调试我的代码”不是这一方的工作方式(请看“如何问”)。你尝试了什么,得到了什么?
  • @FUZxxl,在我看来,最初的问题是关于 C 和 C++ 中同一问题的信息的完全公平的请求。问题的重要部分在 C 和 C++ 中是相同的;但是最好的答案在 C 和 C++ 之间是不同的。所以事实证明,两者都要求是个好主意。当初学者只对一个标签感兴趣时,反对同时使用 C 和 C++ 标签的初学者通常是正确的。但这篇文章不值得被专家劫持。
  • @JSF C 和 C++ 之间存在细微差别,即使在重叠部分也是如此。在任何情况下,初学者都不应该认为他们可以将 C 代码编译为 C++ 就可以了。因此,一个问题必须指定最多一种编程语言来解决问题的严格政策,除非问题是关于多种编程语言的交互。

标签: c database struct


【解决方案1】:

void new_company(database x){

您按值传递对象,因此该函数获取本地副本。在函数内部对对象所做的任何更改仅影响本地副本,而不影响原始副本。那是你的问题。

在 C++ 中,对这个问题的修正更简单。您只需将函数的签名更改为

void new_company(database& x){

在 C 中,更改更加困难。调用者将其传递给函数的对象名称前需要&amp;,函数签名中的名称前需要*,并且需要更改所有用于访问成员的.函数内对象的-&gt;

【讨论】:

  • 谢谢伙计,它可以工作,我按照你说的那样更改了所有功能,但是在我在控制台中输入以下行后它给了我程序崩溃:scanf("%d",x->number_employers);我设法修复它在 x 前面引入 & ,但是这条线在前面没有 & 的情况下工作:scanf("%s",x->dataname);和 scanf("%s",x->date);那么为什么没有崩溃,最好使用 & 或保持原样?
  • 在大多数情况下,数组的名称,例如x-&gt;dataname 表示数组第一个元素的地址。标量的名称,例如 x-&gt;number_employers 指的是值。 scanf 需要一个存储结果的地址,无论它是读取数字还是字符数组。所以它需要&amp; 使x-&gt;number_employers 成为一个地址,而x-&gt;dataname 已经是一个地址。
【解决方案2】:

因为您是按值传递数据库对象,所以传入了(未初始化的)字典对象的副本,新公司正在更新该副本。传入字典的地址,例如

new_company(&Tarom);

并更改 new_company 定义以获取指向数据库的指针,例如:

void new_company(database* x){

【讨论】:

  • 否决这些答案的人愿意分享原因吗?
猜你喜欢
  • 2015-06-18
  • 2011-03-19
  • 2018-08-30
  • 2011-01-10
  • 1970-01-01
  • 2019-06-05
  • 2018-06-01
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多