您的位置:首页 > 编程语言 > C语言/C++

浅谈c语言中的易错点

2015-11-17 11:58 148 查看
1、printf中字符串过长时需要折行书写使得程序更加易读

printf("随便打的话随便打的话随便打的话随便打的话随便打的话");


用下面的方式直接折行会报错

printf("随便打的话随便打的话随便打的话
随便打的话随便打的话");


①用”” “”字符串分成几段中间回车折行。

printf("随便打的话"
"随便打的话");


②加\用回车折行。

printf("随便打的话\
随便打的话");


③用多句printf书写。

printf("随便打的话");
printf("随便打的话");


2、为防止数据精度不符合要求要善于应用格式控制符如%m.nf

示例中是将数据四舍五入到到小数点后七位然后输出

x=s*10000000+0.5;
s=x/10000000.0;
printf("lf",s);


但是输出来的数据只有小数点后的六位。

这是因为如果不加精度限制编译系统默认输出小数点后6位。正确格式应为:
printf("%.7lf",s);


3、在使用scanf和getchar前最好清空缓存区

do
{
scanf("%s",a);
printf("Continue?\n");
m=getch();
}while(m!='n'&&m!='N');


如果用户在提示语Continue后输入字符过多将会跳过scanf直接读取缓冲区。因为scanf会先读取缓冲区的内容。所以应当在scanf前加:

fflush(stdin);


4、使用strcat连接字符串时应对被连接字符数组赋值。

char* a[] = {"stay ","here ","for a lifetime"};
char b[1000] ;
for(i=0;i<a;i++)
strcat(b,a[i]);


如上程序会在运行时提示空指针错误。应先赋值在进行连接操作。

char* a[] = {"stay ","here ","for a lifetime"};
char b[1000] ;
strcpy(b,a[0]);
for(i=1;i<a;i++)
strcat(b,a[i]);


5、运算符的优先级。

1级优先级(左结合)

() 圆括号;[]下标运算符;->指向结构体成员运算符;. 结构体成员运算符。

2级优先级(右结合)

!逻辑非运算符;~按位取反运算符;++前缀增量运算符;–前缀减量运算符;+正号运算符;-负号运算符;(类型)类型转换运算符;*指针运算符;&地址运算符;sizeof长度运算符。

3级优先级(左结合)

*乘法运算符;/除法运算符;%取余运算符。

4级优先级(左结合)

+加法运算符;-减法运算符。

5级优先级(左结合)

<<左移运算符;>>右移运算符。

6、当一些较老版本的编译器不支持long long时可以使用__int64 来定义64位长整型。

一般来说,64位整型的定义方式有 long long 和 __int64 两种(VC 6.0 只还支持__int64),而输出方式也有 printf(“%lld”, a)、printf(“%I64d”, a)、cout << a 三种。在C99标准中,增加了对64位长整型数据的支持,它的类型就是 long long,占用8个字节。由于C99标准发布较晚,一些较老的C/C++编译器不支持。

__int64 x;
long n;
scanf("%d",&n);
x=(1+n)*n/2;
printf("%I64d",x);


以上示例为vc6.0的编译环境下的64位长整型的使用方式。

这里讨论的是五种常用的C/C++编译器对64位整型的支持,它们分别是gcc(mingw32)、g++(mingw32)、gcc(linux i386)、g++(linux i386)、Microsoft Visual C++ 6.0。可惜的是,没有一种定义和输出方式的组合能同时兼容这五种编译器。



7、main()函数的返回类型必须是int型。

尽管在C89标准的main()函数是可接受的,但最新的C99标准只定义了如下两种可接受的函数原型:

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


void main 主函数没有返回值,main 默认为int 型,即 int main(), 返回整数。注意,新标准不允许使用默认返回值,即int不能省,而且对应main函数不再支持void型返回值,因此为了使程序有很好的移植性,强烈建议使用:

int main( void )
{
return 0;
}`


8、scanf连续录入数据的两种方式

scanf("%d%d%d",&a,&b,&c);
scanf("%d,%d,%d",&a,&b,&c);


以上两种方式均可以实现数据的连续录入,但是使用第二种方式时录入的数据间输入的不是空格而是逗号运算符。

by Riddle
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: