C语言新手踩坑记!大坑小坑全部都是你的!

1.scanf函数

在学习C语言的时候,printf()函数和scanf()函数应该是最先学习到的两个库函数了。虽然这两个函数使用简单,但却也存在不少的坑。比如编译运行都很顺利,没有出现任何报错,但是在输入数据后回车却无法执行下一个语句。这就是scanf()使用不当造成的问题。例如这个程序:

#include<stdio.h>

intmax(inta,intb)

{

if(a > b)

returna;

else

returnb;

}

intmain()

{

inta,b,c;

scanf("%d %d\n", &a, &b);

c = max(a, b);

printf("%d is max\n", c);

return0;

}

这个程序是输入两个整数,然后经过比较之后输出最大的数字。但是输入数字后回车无效,并没有打印出结果,这时必须输入字符才能打印出结果。

 

C语言新手踩坑记!大坑小坑全部都是你的!出现这种情况的原因是,”\n“在scanf()中并不表示等待换行符,而是读取并放弃连续的空白字符。事实上,scanf()格式符中的任何空白字符都表示读取并放弃空白字符,而且诸如"%d"这样的格式也会自动人抛弃前面的空白。因此,”%d\n“中的”\n“会让scanf()读到非空白字符为止,只需要再输入一个非空字符即可。但是如果之后程序还需要读取其他数据进行处理,而程序的使用者并不知情的话,那么就会导致结果并非预想的那样。所以,这时去掉后面的”\n“即可使程序正常运行。

2.类型转换

在程序中往往会因为业务需求的不同而定义不同类型的数据,并且对其进行运算,但如果不考虑数据类型的取值范围以及转换带来的损失,那么程序运行的结果往往也是未知的。例如下面这个程序:

#include<stdio.h>

intmain()

{

inta =-11;

unsignedintb =1;

if(a + b >0)

printf("a + b > 0\n");

elseif(a + b =0)

printf("a + b = 0\n");

elseif(a + b <0)

printf("a + b < 0\n");

return0;

}

你可能认为很简单,明摆着的-11+1<0嘛,然而程序运行的结果并不如你愿。

 

C语言新手踩坑记!大坑小坑全部都是你的!

在不同类型的数据进行运算时如果不进行强制类型转换,那么在数据运算时会将表示范围较小的数据自动转换为表示范围更广的数再参与运算。所以这道题里int 型的a会先转换成unsigned int型,然后再与b进行运算。但通过补码运算转换后,a将会变成一个很大的整数值,再加上1将会远大于0,因此输出的是a+b>0。这种情况下,最好进行强制类型转换或者使用同一类型的变量来避免类似的错误。

PS:“我自己是一名从事了10年的老程序员,辞职目前在做讲师,最近我花了一个月整理了一份最适合2020年学习的c/c++项目实战以及基础教程干货,送给每一位编程小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。工作需要学习C/C++、感兴趣、为了入行、转行学习C/C++的伙伴可以跟我学习,技术大牛助你早日成为一名优秀的程序员,快来和志同道合的小伙伴一起加油学习、一起成长进步吧!

官方企鹅群:72016857

C语言新手踩坑记!大坑小坑全部都是你的!

C语言新手踩坑记!大坑小坑全部都是你的!

C语言新手踩坑记!大坑小坑全部都是你的!

C语言新手踩坑记!大坑小坑全部都是你的!