我是编程的新手,我真的需要你的帮助。多次调用AddS,然后调用ListS以显示存储在struct subject * a中的所有内容后,结构成员标记的第一个打印最多只打印12个字符正确,后跟随机尾随字符。在循环的下一次迭代中,打印标记,所有字符都正确。我已经尝试降低标签的大小,似乎它删除了尾随字符。到底发生了什么?
struct store
{
char call[7], tag[450];
int units;
};
void AddS(struct store *a, int *n)
{
char ecode[8], etags[450];
int f, error = 0;
struct store *tempptr;
scanf("%s", ecode);
scanf("%d", &f);
scanf("%s", etags);
NameLimit(ecode);
if(Initial(ecode) && Occurrence(ecode, a, *n))
{
printf("Error.\n");
error++;
}
if(!error)
{
if(*n)
{
tempptr = realloc(a, *n + 1);
a = tempptr;
}
if(tempptr || !*n)
{
strcpy((a + *subctr) -> call, ecode);
(a + *n) -> units = f;
if (etags[0] == '.')
(a + *n) -> tag[0] = '\0';
else
strcpy((a + *n) -> tag, etags);
printf("%s added.\n", ecode);
*n = *n + 1;
}
else if(tempptr == NULL)
{
printf("No space.\n");
exit(1);
}
}
}
void ListS(struct store *a, int n)
{
int i, j;
for(i = 0; i < n; i++)
printf("%s %d %s\n", (a + i) -> call, (a + i) -> units, (a + i) -> tag);
}
答案 0 :(得分:3)
realloc()
的第二个参数是新分配的字节大小。
没有足够的代码可以确定,但是:
tempptr = realloc(a, *subctr + 1);
tempptr = realloc(a, (*subctr + 1) * sizeof *a);
答案 1 :(得分:1)
结构char code[7]
中定义的成员struct subject
小于您在char ecode[8]
函数中定义的AddS()
。
答案 2 :(得分:-1)
我建议您使用fgets和sscanf,而不是使用scanf来读取输入。 Scanf被认为是相当不安全的。