c-具有字符串的结构的数组



我定义了一个结构

struct subject
{
char name[100];
int year;
};

由于我需要其中的n,并且我必须使用malloc,我在我的主要功能中做了以下操作:

int n, i;
scanf("%d", &n);
struct subject *ptr = malloc(n*sizeof(struct subject));

不幸的是,当我试图用这个代码输入一些东西时:

for(i = 0; i < n; i++)
{
gets((ptr + i)->name);
scanf("%d", (ptr + i)->year);
}

我键入第一个名字后它就崩溃了。该任务需要使用malloc

这是整个代码(不幸的是,它是用我的母语写的,所以有点不同)

#include <stdio.h>
#include<stdlib.h>
#ifndef DEBUG
#define DEBUG(...)printf(_VA_ARGS_)
#endif
struct kolegij
{
char naziv[100];
int semestar;
};
int main(){
int brPredmeta, i;
scanf("%d", &brPredmeta);
struct kolegij *ptr = malloc(brPredmeta*sizeof(struct kolegij));
if(ptr == NULL)
{
printf("errorn");
return 0;
}
for(i = 0; i < brPredmeta; i++)
{
//gets(ptr->naziv);
gets((ptr + i)->naziv);
scanf("%d", &(ptr + i)->semestar);
getchar();
}
for(i = 0; i < brPredmeta; i++)
{
printf("%sn", ptr[i].naziv);
printf("%dn", ptr[i].semestar);
}
return 0;
}

关于重复问题。我认为这不应该是重复的,因为它与结构和指针有关。我以前在扫描方面遇到过问题,我还没有考虑将其作为解决方案,所以我认为不应该将其标记为重复。

我认为语句scanf("%d", (ptr + i)->year);对您的不稳定行为负责,因为您正在传递int,而scanf期望int *。也许你的意思是scanf("%d", &(ptr + i)->year)(注意额外的"与"),尽管这也有相关的危险。也就是说,您正在丢弃返回值,因此您永远无法确定存储的值是否正常。如果用户输入了无效的输入,最好重新提示或退出:

int n;
do {
puts("Enter year: ");
n = scanf("%d", &(ptr + i)->year));
scanf("%*[^n]"); // more on this later
getchar();
} while (n == 0);
if (n < 0) exit(EXIT_FAILURE);

由于处理输入的一部分是期望回车键,我们需要在下一个gets调用之前清除它,我使用scanf("%*[^n]")getchar()

关于您在接近尾声时介绍的代码主题,这看起来确实非常不同。我注意到您修复了scanf类型错误(额外的"与"号),并且在scanf("%d", ...)之后有getchar(),所以通常不会出现尾随换行符。我认为没有理由对此感到怀疑(你帖子末尾的代码);如果你担心关闭的原因,那么你似乎不再有问题了(我们无法重现你的崩溃)。。。我的意思是,除了使用gets;我想这是一个小问题(不推荐使用gets;请改用fgets,修剪后面的'n',如果没有,请再次使用scanf("%*[^n]")getchar()来有效地截断输入)。

Malloc返回一个void指针类型。为了将它用作指向结构的指针,您必须首先对其进行强制转换。尝试将malloc的行更改为:

int n, i;
scanf("%d", &n);
struct subject *ptr = (struct subject*) malloc(n*sizeof(struct subject));

您还必须将输入更改为:

for(i = 0; i < n; i++)
{
gets((ptr + i)->name);
scanf("%d", &((ptr + i)->year));
}

相关内容

  • 没有找到相关文章

最新更新