C 的问题,程序打印不应该打印的值

  • 本文关键字:打印 不应该 问题 程序 c
  • 更新时间 :
  • 英文 :


几天来我一直在尝试查找此代码的问题,但仍然找不到。这里的主要问题是,在打印每个节点的值时,它会尝试打印一个额外的节点并组成新值。

代码的工作方式如下,例如:我输入数字 10,11,15,如果节点的所有三个数字的总和大于 20,那么它会在前面添加双精度,因此结果将是:20,22,30 ||10,11,15.

每次我尝试在Visual Studio Code中执行此代码时,程序都会打印: 20,22,30 ||10,11,15 ||0,26345856,301989906。 如您所见,程序尝试打印另一个不存在的节点,以便它组成值。我已经尝试了一些在线编译器,这不是问题,所以我想知道的是我的代码中是否有任何错误,或者它是否是编译器。

#include <stdio.h>
#include <stdlib.h>
typedef struct list{
int num;
int num1;
int num3;
struct list *next;
}node;

void create (node *p){
printf("Input first number: ");
scanf("%d",&p->num);
if (p->num==0)
p->next=NULL;
else{
printf("Input second number: ");
scanf("%d",&p->num1);
printf("Input third number: ");
scanf("%d",&p->num3);
p->next=(node*)malloc(sizeof(node));
create (p->next);
}
}
void show (node *p){
if (p->next !=NULL){
printf ("n%d",p->num);
printf ("n%d",p->num1);
printf ("n%d",p->num3);
show (p->next);
}
}
node* add(node *p){
node *aux;
if((p->num+p->num1+p->num3)>20){
aux=(node *)malloc(sizeof(node));
aux->num=p->num*2;
aux->num1=p->num1*2;
aux->num3=p->num3*2;
aux->next=p;
p=aux;
}
return p;
}
void add2 (node *p){
node *aux=NULL;
while(p->next!=NULL){
if((p->next->num +p->next->num1+ p->next->num3)>20){
aux=(node *)malloc(sizeof(node));
aux->num=p->next->num*2;  
aux->num1=p->next->num1*2;
aux->num3=p->next->num3*2;
aux->next=p->next; 
p->next=aux;
p=p->next;
}
p=p->next;
}
}
int main(){
node *prin=NULL;
prin=(node*)malloc(sizeof(node));
create(prin);
printf("Input numbers were: ");
show (prin);
prin=add(prin);
add2(prin->next); 
printf("nList with added nodes: ");
show(prin);
}

总是在列表底部创建一个"虚拟"节点。例如,如果输入0作为第一个输入,则将有一个单条目列表,其中仅初始化num(设置为该0)和next(设置为NULL)成员。num1num3字段由create函数保持未初始化状态。同样,如果在给定的测试用例中,您为最后两个字段输入(并初始化)实际值,则在下次调用create仍将创建一个新的"foot"节点。

碰巧的是,在您的系统上,这些未初始化的数据字段具有"随机"值,加起来超过 20 个。(这是 C 标准完全允许的,但默认情况下,某些编译器和/或平台会将未初始化的数据设置为零。

因此,在对add函数的调用中,if测试条件

if ((p->num + p->num1 + p->num3) > 20) {
//...

将评估为TRUE,并将添加一个新节点,num1num3的值是原始"随机"值的两倍。

要解决此问题,请在create函数中将num1num3字段设置为零(或其他一些小/负数),当为num字段输入"哨兵零"输入结束标记时:

void create(node* p)
{
printf("Input first number: ");
scanf("%d", &p->num);
if (p->num == 0) {
p->next = NULL;
p->num1 = 0; // You MUST ensure that the sum of these two numbers
p->num3 = 0; // is LESS THAN 20 ... or a new node will be created
}
else {
printf("Input second number: ");
scanf("%d", &p->num1);
printf("Input third number: ");
scanf("%d", &p->num3);
p->next = (node*)malloc(sizeof(node));
create(p->next);
}
}

编辑:要查看此"错误"是如何发生的,请尝试将num1字段设置为特定数字(例如42),并保留未初始化num3。然后,只有一个"编造"值将无法解释 - 另一个值将是你指定的两倍(所以,84)。恕我直言,这将是一个很好的练习。

最新更新