Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf函数打印不应该打印的内容,为什么?_C_Printf - Fatal编程技术网

C printf函数打印不应该打印的内容,为什么?

C printf函数打印不应该打印的内容,为什么?,c,printf,C,Printf,从下面的图片中可以看到,添加列表顶部的第二个元素会为printf函数创建一种奇怪的行为 添加列表节点的功能是: void add_QUEUEnode_top(Item a) { if (head==NULL) { QUEUEinit(a); } else { QUEUEput_top(a); } return; } void QUEUEinit(Item a) { head=(link)malloc

从下面的图片中可以看到,添加列表顶部的第二个元素会为printf函数创建一种奇怪的行为

添加列表节点的功能是:

void add_QUEUEnode_top(Item a)
{
    if (head==NULL)
    {
        QUEUEinit(a);
    }
    else
    {
        QUEUEput_top(a);
    }
    return;
}

void QUEUEinit(Item a)
{
    head=(link)malloc(sizeof(link*));
    head->next=NULL;
    head->item=a;
    tail=head;
    printf("Coda iniziallizata...\n\n");

}

void QUEUEput_top(Item a)
{
    link tmp;
    tmp=(link)malloc(sizeof(link*));
    tmp->item=a;
    tmp->next=head;
    head=tmp;
    return;
}
以下是处理项目的函数:

Item fill_item()
{
    Item a;
    int i;
    for(i=0; i<DIM-1; i++)
    {
        a.stringa[i]=rand();
    }
    a.stringa[DIM-1]='\0';
    a.numero=rand();
    printf("\nOggetto generato: \n");
    print_item(a);
    return a;
}

void print_item(Item a)
{
    printf("\nStringa elemento: ");
    printf("%s", a.stringa);
    printf("\nNumero elemento:  %d\n", a.numero);
}
typedef struct
{
    char stringa[DIM];
    int numero;
} Item;
链接指针的定义:

typedef struct QUEUEnode *link;
链接结构的定义:

struct QUEUEnode
    {
        Item item;
        link next;
    };

您有几个bug-我将尝试为您查找更多bug,但您所问的具体问题与以下代码有关:

for(i=0; i<DIM-1; i++)
{
    a.stringa[i]=rand();
}
a.stringa[DIM-1]='\0';
它们应该是:

head = malloc(sizeof(struct QUEUEnode));
tmp = malloc(sizeof(struct QUEUEnode));
也就是说,您应该为整个struct QUEUEnode分配足够的大小,而不仅仅是一个指向该结构的指针。或者一个指向一个的指针,这就是你所拥有的。将指针类型隐藏在typedef中,就像使用typedef struct QUEUEnode*link一样;这是一种有争议的风格选择——我个人不喜欢,因为它很快就把这类问题弄糊涂了

在这个程序中,你通过值传递了很多结构。这是很好而且有效的C语言,只是有点不习惯。通常情况下,人们会传递指针。如果您的结构增长到任何可感知的大小,由于所有内隐记忆复制的进行,性能可能会开始受到严重影响


您有几个bug-我将尝试为您查找更多bug,但您所问的具体问题与以下代码有关:

for(i=0; i<DIM-1; i++)
{
    a.stringa[i]=rand();
}
a.stringa[DIM-1]='\0';
它们应该是:

head = malloc(sizeof(struct QUEUEnode));
tmp = malloc(sizeof(struct QUEUEnode));
也就是说,您应该为整个struct QUEUEnode分配足够的大小,而不仅仅是一个指向该结构的指针。或者一个指向一个的指针,这就是你所拥有的。将指针类型隐藏在typedef中,就像使用typedef struct QUEUEnode*link一样;这是一种有争议的风格选择——我个人不喜欢,因为它很快就把这类问题弄糊涂了

在这个程序中,你通过值传递了很多结构。这是很好而且有效的C语言,只是有点不习惯。通常情况下,人们会传递指针。如果您的结构增长到任何可感知的大小,由于所有内隐记忆复制的进行,性能可能会开始受到严重影响


将随机文本分配给stringa,然后将numero设置为随机数。当你打印这些东西时,你会得到随机输出。因为你没有把随机性限制在可打印的字符上,奇怪的事情就发生了。您正在打印控制字符。您的第二个屏幕截图将表明您打印了一个字符。我肯定你不想那样做

该程序正按照您的要求执行。由于您没有说明要从哪个字符集分配给stringa,所以我真的无法说明您的程序应该是什么。您可以通过此更改使其选择A到Z范围内的值:

a.stringa[i] = 'A' + rand() % 26;

我敢打赌,您的代码还存在其他问题,但由于问题的主要焦点是打印,因此我不会深入研究。

您将随机文本分配给stringa,然后将numero设置为随机数。当你打印这些东西时,你会得到随机输出。因为你没有把随机性限制在可打印的字符上,奇怪的事情就发生了。您正在打印控制字符。您的第二个屏幕截图将表明您打印了一个字符。我肯定你不想那样做

该程序正按照您的要求执行。由于您没有说明要从哪个字符集分配给stringa,所以我真的无法说明您的程序应该是什么。您可以通过此更改使其选择A到Z范围内的值:

a.stringa[i] = 'A' + rand() % 26;

我敢打赌,您的代码还存在其他问题,但由于问题的主要焦点是打印,我不会再深入研究了。

链接和项目的定义是什么?我会注意到,看起来像head=linkmallocsizeoflink*;他们很可疑。铸造到与您使用的尺寸不同的类型?事实上,在C语言中甚至不需要演员阵容,但是你需要做一个疯狂的演员这一事实更能说明问题……首先,mallocsizeoflink*一行并没有分配你认为它能做的事情。它为指针分配了足够的内存,即4或8个字节,这很可能不足以满足您的链接结构。链接和项目的定义是什么?我会注意到,看起来像head=linkmallocsizeoflink*;他们很可疑。铸造到与您使用的尺寸不同的类型?事实上,在C语言中甚至不需要演员阵容,但是你需要做一个疯狂的演员这一事实更能说明问题……首先,mallocsizeoflink*一行并没有分配你认为它能做的事情。它为指针分配了足够的内存,即4或8个字节,这很可能不足以满足您的链接结构。哦,如果我将rand除以ASCII max项?不,这也不起作用。字符串中有很多ASCII字符,您可能不需要。我只需要一些东西来填充字符串
ng,这是一项大学运动;如何在仅有的字母数字ASCII字符之间生成随机数?检查ASCII表格-数字需要48到57之间的随机数,大写字母需要65到90之间的随机数,小写字母需要97到122之间的随机数。我想你可以直接通过一些算法生成,也可以简单地通过使用isalnum丢弃不好的。不过,我不确定这是不是一个好的解决方案。。。。或者更好,head=mallocsizeof*head;哦,如果我把rand除以ASCII max项?不,那也不行。字符串中有很多ASCII字符,你可能不需要。我只需要一些东西来填充字符串,这是一个大学练习;如何在仅有的字母数字ASCII字符之间生成随机数?检查ASCII表格-数字需要48到57之间的随机数,大写字母需要65到90之间的随机数,小写字母需要97到122之间的随机数。我想你可以直接通过一些算法生成,也可以简单地通过使用isalnum丢弃不好的。不过,我不确定这是不是一个好的解决方案。。。。或者更好,head=mallocsizeof*head;是的,但是看看第二个图像,在生成字符串之前发生了什么@LambertoBasti,这可能是因为在该字符串中随机生成了一个回车字符。这只是非打印字符。可能是一个CR字符。是的,但是看看第二个图像,在生成字符串之前发生了什么@LambertoBasti,这可能是因为在该字符串中随机生成了一个回车字符。这只是非打印字符。可能是一个CR角色。