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类型。