C printf函数打印不应该打印的内容,为什么?
从下面的图片中可以看到,添加列表顶部的第二个元素会为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
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角色。