zoukankan      html  css  js  c++  java
  • 新手在学习c语言中可能遇到的

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

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

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

    在这里插入图片描述
    像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(10*sizeof(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字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’’)结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;若参数endptr为NULL,则会不返回非法字符串。
    endptr只是接受结束时返回的地址,不需要初始化指向某个内存
    5 示例代码:
    在这里插入图片描述

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

  • 相关阅读:
    unity3d应用内分享(微信、微博等)的实现
    Cocostudio 文章列表
    C++ 文章列表
    Android 文章列表
    js函数节流和函数防抖
    js实现队列-通过闭包方式
    初学js正则
    Android网络图片加载
    利用html5制作正方体,同时实现3D旋转效果
    Python模块——random随机模块
  • 原文地址:https://www.cnblogs.com/gao-hongxiang/p/12342436.html
Copyright © 2011-2022 走看看