代码改变世界

C/C++ 误区汇总

2010-04-22 18:07  Logic0  阅读(231)  评论(0编辑  收藏  举报
我顶 字号:
  • void main()误区

 C标准C99或者C++标准C98都没有说这是可以用的,正确的方式有以下两种:

/*C语言*/

int main(void)

int main(int argc , int *argv[])

/*C++语言*/

int main()

int main(int argc , int *argv[])

  • fflush(stdin)的误区

首先看下面的程序:

#include <stdio.h>
int main()
{
    int a;
    while(1)
    {
        fputs("input an integer:",stdout);
        scanf("%d",&a);
        printf("%d\n",a);
    }
    return 0;
}

    正常情况下,程序会提示用户输入一个整数,然后输出,继续等待输入下一个整数。但是,一旦用户输入了一个错误的数据呢,比如2ab,那么程序就会读取一个2,然后一直输出input an integer:2。这是为什么?

    这是因为,scanf("%d",&a);要求scanf获取一个整数,所以字母a(其他非数字字符也一样)遗留在了“输入缓冲区”。当程序继续执行,因为输入缓冲区不为空,所以scanf就不会等待用户输入,又因为缓冲区内的字符不是数字,scanf不会去读取,字母a再次被遗留在输入缓冲区,如此反复反复,从而导致不停地输出“input an integer:2”。  

   使用fflush(stdin)来解决这个问题是不正确的。

   fflush规定不能用于输入流的,尽管有些时候可以解决问题,但那是与编译器有关的,MSDN里边有说VC6的这个fflush是扩展特性。在GCC下是无效的(GCC 4.3.3测试无效)。

  • malloc等分配内存后的强制转换误区(仅限C语言)

    新C标准里的内存分配的返回值为void *指针,void指针可以直接赋值给任何类型的指针(除函数指针外)。历史问题我们不讨论。

  • char c = getchar() 误区

    fgetc , getchar , getc返回值都为int,使用char 类型接收返回值将导致截断。EOF返回值在不同的系统上并不一定都是-1,而且不同编译器上char 默认为signed 还是unsigned还是有待考究。为了程序的可移植性和规范性,应该用int接收返回值并判断非EOF后再赋值给char类型。