我定义了一个结构
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));
}