【问题标题】:Accessing array of structure using pointer. ( Something wrong with the code)使用指针访问结构数组。 (代码有问题)
【发布时间】:2016-08-20 16:00:25
【问题描述】:

有一个结构体数组,传递给accept函数,以便在结构体中存储一些值。 accept 函数内的循环只迭代一次,最多只能到 scanf。

struct emp
{
    int age;
    char name[20];
    float sal;
};

void display(struct emp *);
void accept(struct emp *);

void main()
{
clrscr();
struct emp E[3];
accept(E);
display(E);
getch();
}

void accept(struct emp *p)
{
int i;
for(i=0;i<3;i++)
{
  printf("Enter age, name and sal: ");
  scanf("%d %s %f",&(p+i)->age,(p+i)->name,&(p+i)->sal);
}
}

void display(struct emp *p)
{
int i;
for(i=0;i<3;i++)
{
printf("Result: %d %s %f",(p+i)->age,(p+i)->name,(p+i)->sal);
}
}

请更正代码。

【问题讨论】:

  • 然后会发生什么?程序是否崩溃,是否挂起,是否调用了显示函数,...?
  • 仍然缺少的信息:您要输入什么,使用调试器中断函数时会发生什么,...
  • 显示您的输入之一
  • 在修复main的签名并删除特定于平台的clrscrgetch之后,它appears to work fine(在测试可读性后添加了换行符)。
  • main() 的签名?

标签: c pointers structure


【解决方案1】:

如果您使用空格字符输入name,请尝试以下方式:

scanf("%d %[^\n]s %f",&(p+i)->age,(p+i)->name,&(p+i)->sal);

注意:我还删除了clrscr()getch() 并使用int main() 而不是void main()。因为这些都是错误的。

【讨论】:

  • 很好:-)。请解释一下你做了什么,效果很好。谢谢
  • %[^\n]s 包含空格字符。
  • 我没有取任何带有空格字符的名字,只有 1 个单词的名字。仍然......它崩溃了
【解决方案2】:

尝试使用:

scanf("%d %s %f\n",&(p+i)->age,(p+i)->name,&(p+i)->sal);

【讨论】:

  • 输入浮点值后,将需要一个输入来中断 scanf,因此 \n 将充当该输入。它会破坏对回车键的控制。
【解决方案3】:

尝试使用 gets() 函数读取用户输入(读取整行),然后使用 sscanf() 将数据读取到变量中。

【讨论】:

  • "gets() 函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制可以出现的内容的环境中运行在标准输入上)。因此,该功能已在 C99 标准的第三次勘误中被弃用,并在 C11 标准中完全删除。fgets()gets_s() 是推荐的替代品。"
  • 好吧,Quentin,鉴于发帖者的明显新手级别(无意冒犯),能够读取数据是这里的目标,而不是编写专业应用程序。关键是简单地读取一行数据并处理它们,OP 现在似乎无法做到这一点,所以我只是建议使用最基本形式的“输入”函数(也是最简单的)。使用更“安全”的函数形式是另一回事,此时 OP 对此没什么兴趣。仅仅为此而投反对票会适得其反并且令人沮丧。我最好不要发布答案吗?
  • 我明白你的意思。但是试图通过推荐 gets 来避免解释 fgets 是过分的:OP 可以再花 12 秒来理解 fgets 的大小参数的作用,而不是学习使用已失效的函数这是被设计破坏的,以后必须忘记它。如果你坚持推荐gets,至少你应该提一下,这只是一个暂时的“便利”。
  • 除了gets (这是在它自己的特殊情况下令人震惊的、不可修复的弃用),您没有解释 OP 的代码有什么问题,以及为什么中间缓冲区会有所帮助。这将是非常有价值的信息,并且比“你的东西坏了,改用那个东西”栏改善你的答案。
  • 我确实解释过,gets() 或 (gets_s()) 读取一整行输入文本(直到到达行尾 [Enter])但显然你没有看到它,因为您专注于 gets() 。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多