为什么我的char数组打印随机尾随字符?

时间:2014-10-22 10:10:06

标签: c arrays string random character

我是编程的新手,我真的需要你的帮助。多次调用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);
}   

3 个答案:

答案 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被认为是相当不安全的。