新手在学习c语言中可能遇到的

本人之前从未接触过c语言,可以说完全是个新手,不过,越是新手越可能接近同样作为新手的你们,越会了解新手常犯的错误,今日特在这里立文记录一下平常可能会犯的一些错误,以便日后复习并帮助同在学习中跌跌撞撞的你。(本文会持续更新补充)如有错误,请各位大佬指正。

1.while()或if()中i==1写成i=1
2.关于域宽与类型转换中的舍弃与四舍五入与类型转换的条件
printf时限定域宽,如果实际长度超出域宽,则按实际长度输出,域宽限定无效;
scanf时限定域宽,如果实际长度超过域宽,也只能保留域宽内的长度,超出部分无效;
限定域宽时是直接舍弃不进行四舍五入,只有在"%.3f""%.4f"会进行四舍五入

类型转换一种是自动转换,这时是指在计算中的自动转换,注意是在计算中比如

`](ht](https://img-blog.csdn.net/20181017124711405?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNTc2NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)像double型数据也是不能用%f来输入的,这样也会出现奇怪的数字。这里是会出错的,他不会格式转换,另外一种则是强制转换,可以在任何情况下转换
3.注意逻辑语句与条件语句中的短值求解原则!!这里新手很容易不注意就错了
如果前面的表达式已经能确定对错,那么就不用再去看后面的;后面的表达式也不会去计算在这里插入图片描述这里所举的例子都很简单,只是为了示意。在这里插入图片描述
在这里插入图片描述

4.注意实型数据是有误差的!
两者本来都是3.3,按说是相等的啊!怎么就不相等呢?原因就是**计算机无法将实数的某些小数部分精确地用二进制数来表示(如0.3,0.6等),会造成实型数据在运算时有误差;**因此,我们常用在一定精度内近似相等作为判断条件,如|x-y|<1e5这种形式

5.关于多个scanf连续输入时的问题

在这里插入图片描述
我明明输入了5个数,为什么输出只有4个数呢?起初我也没有找到原因,原因就是当你输入那5个数后按下回车时,scanf会结束并把回车读入输入缓存区,当我输出的时候,回车也作为一个字符被输出,因此就只会再输出剩下的4个字符,两行数据隔了一行也就是这个原因。

在这里插入图片描述
6.定义一个指针数组,如何对它输入字符串?

char*name[3],能用
for(i=0;i<3;i++)
{
scanf("%s",name+i);
}输入3个字符串吗?是不是只能用赋初值的方法赋值·??

指针要么是在初始化的时候进行赋值,如:char *p = “hello world!”;要么在之后将指针指向一个已经初始化的内存空间,因为只定义而未初始化的指针不会指向任何内存空间,是不能对指针指向的地方进行赋值的。这就是为什么如果只定义了指针,而为初始化时要使用Xalloc或者new来申请空间。 你这样写的话,应该是不行的,要么你在后面加malloc或new申请空间在赋值,要么直接把指针指向一个已经初始化好的内存空间!以上解释和以下代码仅供参考
#include “iostream”
using namespace std;
int main ()
{
char *ptr[3];
for(int i = 0 ; i <= 2 ; i++)
//ptr[i] = “hello!”; 重新指向
{
ptr[i] = (char )malloc(10sizeof(char)); //申请空间,与上面的重新指向区别
cin>>ptr[i];
}
for(i = 0; i <= 2 ; i++)
cout <<ptr[i] << endl;
return 0 ;
}

什么方法能比较好地输入字符串呢?用字符数组能用gets函数输入,但长度有限;而指针数组不需限制字符串的长度,但还是需要事先定义,不能比较方便地输入。有没有可从键盘输入,但又不需限制长度的方法呢

这个貌似是不可以的,你要是想从键盘输入字符串,那必须指定将数据存储到什么地方,就需要你事先开辟空间,那部分空间的大小也就是实现定好的,键盘输入就是让你往里面去填;要么就是指针指向,这里也是需要有已知空间(地址和大小)让你重新指向。。

注:第6条为百度知道搬运,本人搞不太清这个问题故放在这里
7.
1 函数名: strtol
2 声明:long int strtol(const char *nptr,char **endptr,int base);
3 功能:将参数nptr字符串根据参数base来转换成长整型数。
4 说明:参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;若参数endptr为NULL,则会不返回非法字符串。
endptr只是接受结束时返回的地址,不需要初始化指向某个内存
5 示例代码:
在这里插入图片描述

在这里插入图片描述
**此函数可以实现1~32进制转换为8(0),16(0x),10(%d/ld之类默认)进制
“用strtol怎么将12进制数转化成十进制呢”——printf("%d\n",strtol(“12”,NULL,12));——这样就将12进制的12化成10进制的整型数了,它是14。当然,“12”可以是个字符串,如:char a[]=“123456”;
strtol(a,NULL,12);,括号()中的最后一个形参就是a的进制数。至于把12进制转换为8进制,那可以这样:printf("%o\n",strtol(a,NULL,12));,这就把12进制123456转换成8进制1102302显示出来了。

猜你喜欢

转载自blog.csdn.net/weixin_43305764/article/details/83020907
今日推荐