6.做项目重点注意事项(原创)

第一个问题:关于C语言的清除缓冲区

当使用getchar()函数返回值作为参数的输入时(尤其是递归等反复调用的函数),如果不清除缓冲区,会导致回车符也被参数获取,根本无法完成参数的完整输入。

1:介绍三种方式清除C语言编译时printf的缓存:

   第一种:setbuf(stdin,NULL);

     头文件:include<stdio.h>

   第二种:_ _fpurge(stdin);(相当于Unix下面的fflush()。)

     头文件:include<stdio_ext.h>

   第三种:while((c=getchar())!='\n'&&!=EOF);

   其中以第二种方式最为有效与普遍。

    (1)void setbuf(FILE *stream,char *buf); 

       设置文件缓冲区函数 void setbuf(FILE *stream,char *buf); 

       这个函数将使得打开文件后,用户可建立自己的文件缓冲区。 

       对于setbuf()函数,buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节。当选定buf为空时, setbuf函数将使的文件I/O不带缓冲。

       (2)fpurge用于将缓冲区内的数据完全清除

       The function fpurge() erases any input or output buffered in the given stream. For output streams this discards any unwritten output. For input streams this discards any input read from the underlying object but not yet obtained via getc(3); this includes any text pushed back via ungetc(3).

      也就是说,fpurge函数会直接删除当前缓冲区中的内容。


    (3)int fflush(FILE *stream); int flushall(); fflush() 

       The function fflush() forces a write of all buffered data for the given output or update stream via the stream's underlying write function. The open status of the stream is unaffected.

If the stream argument is NULL, fflush() flushes all open output streams.

       从上面的说明可以看出,fflush是强制把缓冲区中数据输出到给定输出,在上面的例子中,在scanf函数之后调用fflush函数没有任何作用,因为此时还没有为后面的'\n'字符指定一个输出。

      int fflush(FILE *stream); int flushall(); fflush()  函数将清除由stream指向的文件缓冲区里的内容,常用于写完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。

      flushall()将清除所有打开文件所对应的文件缓冲区。

         对于由写操作打开的文件,调用fflush将导致输出缓冲区的内容被实际地写入该文件


第二个问题:函数参数和返回值继续使用的问题

       (1)将参数定义为指针的指针,如果是定义一个指针,传入函数中修改,之后再传入另一个函数,此时参数是不能被第一个函数修改成功的;

       (2)或者定义一个指针,传入后,再返回来才行。

以创建二叉树为例:

首先是指针的指针:

  1. typedef struct _BiTNode  
  2. {  
  3.     int data;  
  4.     _BiTNode *leftChild;  
  5.     _BiTNode *rightChild;  
  6. }BiTNode, *pBiTree;  

  1. //创建二叉树, 先序顺序  
  2. int CreateBiTree(pBiTree *root)  
  3. {  
  4.     char ch = 0;  
  5.     fflush(stdin);  
  6.     if ((ch = getchar()) == 'a')//控制树的结构  
  7.     {  
  8.         *root = NULL;  
  9.     }  
  10.     else  
  11.     {  
  12.         *root = (BiTNode *)malloc(sizeof(BiTNode));  
  13.         if (!(*root))  
  14.         {  
  15.             return RET_ERROR;  
  16.         }  
  17.         (*root)->data = GetRandom();  
  18.         CreateBiTree(&(*root)->leftChild);  
  19.         CreateBiTree(&(*root)->rightChild);  
  20.     }  
  21.     return RET_OK;  
  22. }  
  23.   
然后是返回指针:

  1. struct BiTreeNode{  
  2.  int c;  
  3.  struct BiTreeNode *left;  
  4.  struct BiTreeNode *right;  
  5. }; 

  1. //创建二叉树--先序输入--递归  
  2. BiTreeNode* createBiTreePreOrder()  
  3. {  
  4.     BiTreeNode *ptree=NULL;  
  5.     char ch;  
  6.     ch=getchar();  
  7.     if(ch==' ')  
  8.         ptree=NULL;  
  9.     else  
  10.     {  
  11.         ptree=(struct BiTreeNode *)malloc(sizeof(BiTreeNode));  
  12.         ptree->c=ch;  
  13.         ptree->left=createBiTreePreOrder();  
  14.         ptree->right=createBiTreePreOrder();  
  15.     }  
  16.     return ptree;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值