2013-02-20 66 views
0

这是我写的一段代码,它在链表中添加了人的名字。当我试图显示这些名字时,问题就出现了。代替打印名字,我的代码打印乱码 代码...C:链表打印垃圾字符

struct node 
{ 
char name1[5]; 
struct node *link; 
}; 


void add(struct node **q,char *name) 
{ 
struct node *temp,*r; 
if(*q==NULL) 
{ 
      temp=malloc(sizeof(struct node)); 
      *temp->name1=name; 
      temp->link=NULL; 
      *q=temp; 
      count++; 
} 
else 
{ 
    count++; 
    temp=*q; 
    while(temp->link !=NULL) 
    temp=temp->link; 

    r=malloc(sizeof(struct node)); 
    *r->name1=name; 
    r->link=NULL; 
    temp->link=r; 
}  

} 



void display(struct node *q) 
{ 
    while(q!=NULL) 
    { 
     printf("%s",q->name1); //it prints junk characters 
     q=q->link; 
     }     

}  
int main() 
{ 
    struct node *p; 
    p=NULL; 

    add(&p,"Alice"); 
    add(&p,"Cat"); 
    add(&p,"Pawan"); 
    add(&p,"BoB"); 

    display(p); 
    getch(); 
    return 0; 
}    
+0

你会得到一些答案,告诉你代码有什么问题,但是为了将来的参考,你可以通过编译启用警告来自己发现一些错误。例如,用'gcc -Wall'编译你的确切代码告诉我@ unwind的答案指出了什么。 – 2013-02-20 13:33:05

回答

2

此:

*temp->name1=name; 

不会做你所期望的,在所有。它将name字符串的地址转换为字符,并将第一个字符temp1->name1设置为该值。

这个错误的转换应该已经产生了编译器警告:确保你启用了编译器能够执行的所有警告,并且修复了它们的

要纠正代码,你需要真正复制字符串数据:

strcpy(temp->name1, name); 

注意,这是非常危险的,如果name长于name1支撑,即超过4个字符加终止0字符。你可以把它安全使用:

strlcpy(temp->name1, name, sizeof temp->name1); 

,如果你拥有了它,或

snprintf(temp->name1, sizeof temp->name1, "%s", name); 

,如果你有。

+0

ITYM'strncpy'或'strncpy_s'(C11)而不是'strlcpy'? – Jens 2013-02-20 13:36:59

1

char name1[5]数组太小。由于终止NUL,“Alice”是6个字符,但您的数组只有5个字符,从C语言中导致未定义行为。正如Unwind指出的那样,*temp->name1中还有一个额外的解除引用错误,它可能应该是temp->name1