码迷,mamicode.com
首页 > 其他好文 > 详细

C常见陷阱,scanf不执行,以及指针类型应用传递。

时间:2018-09-16 22:06:30      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:开始   工作   create   主函数   data   应用   can   结果   lin   

1.最近写了个结构体,一开始是这样的:

typedef struct fsll

{

  int  data_field;

  struct fsll *next;

}FSLL;

很普通的一个链表结构体,工作需要数据域改成char类型。

typedef struct fsll

{

  char data_field;

  struct fsll *next;

}FSLL;

...

for(...)

{

printf("请输入数据域内容:")

scanf("%c",&p->data_field);

}

发现scanf每隔一句就会被跳过一次。执行结果就是链表中的数据域是这样的:( )->(A)->( )->(C)->....

其实原因就是windows下,键入回车键产生了两个字符:013 回车与010换行。编辑器把013回车作为判断输入结束的标志,而010  也就是\n留在了输入流的首端。第二次循环中。scanf的真正功能是从输入流中读取相应数量的字符,%d不会匹配\n,所以一般的数字链表不会产生这种问题。但%c,%s这种,可以从输入流中读取\n,也就造成了第二次scanf从键盘赋值得到了一个\n(输出\n什么也不显示),效果看起来就像是scanf间歇性被跳过。解决办法很简单,就是每次用scanf获取键盘的字符类型时,在语句前面调用一次getchar();消耗掉\n,以便scanf可以获取正确的值。关于getchar的妙用还有很多,以后有机会慢慢讲。

for(...)

{

printf("请输入数据域内容:")

getchar();

scanf("%c",&p->next);

}

2.把建立线性表封装成函数,实现在主函数中调用中,碰到了问题。由于纯C语言并不支持引用传递,所以像这种写法是会报错的:

void create_linked_list(FSLL *&head);

但如果想让参数在主函数与自定义函数之间传递(真正改变head的值),需要使用地址传递的方式,而用地址传递一个指针变量的写法也是真的很难看:

void create_linked_list(FSLL **head);

没错,这就是把指针变量的地址传进来,直接改地址对应的值,实现对实际参数的改变(真底层);

调用的时候是这样:

FSLL *head;

create_linked_list(&head);

以上就结束了本片博客

 

 

typedef struct fsll

{

  int  data_field;

  struct fsll *next;

}FSLL;

C常见陷阱,scanf不执行,以及指针类型应用传递。

标签:开始   工作   create   主函数   data   应用   can   结果   lin   

原文地址:https://www.cnblogs.com/hanrui0617/p/9657562.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!