c语言之开发中常用的几个函数(一)

给初学c语言的朋友们推荐几个我实际在工作中经常用到的几个函数,并且经常出错的函数。

最近在做界面与底层,底层与服务器之间的通讯和交互的功能。1、sprintf这个函数通常被我用来拼接字符串用。函数原型:int sprintf( char *buffer, const char *format [, argument,...] );除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串("%3d%6.2f%#x%o",%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函数的精华。先上一段代码

int main()
{
    char *a = NULL;
    char *b = "I love work";
    sprintf(a,"%s ,me too",b);
    printf("a is %s\n",a);
    return 0;
}

华丽的Segmentation fault (core dumped)。(以前的时候,看到段错误就头疼,现在不知道怎么了,看到段错误就很兴奋,改天写一篇关于Segmentation fault (core dumped)错误的文章)。
先不解释,再上一段代码:

int main()
{
    char a[10],c[20];
    char *b = "I love work";
    sprintf(a,"%s ,me too",b);
    sprintf(c,"%s ,hello",b);
    printf("a is %s\n",a);
    return 0;
}
又华丽丽的Segmentation fault (core dumped)错误了。这里的变量c纯粹就是为了造成段错误而存在的,因为编译器有时候会很“讨厌的”不去”深究“越界的事情,可能后续暂时没有用到越过界的那块区域的话,编译器就可能睁一只闭一只眼了,所以为了让编译器“秉公执法”,我们就给它施施压。
这就是sprintf难以平衡的地方,就像小狗自身的生存能力和输出总是难以平衡一样。
简单说一下出错的原因:
sprintf最终的结果是一个被重写过的参数一,前篇文章中提到过,如果内容被修改,就不能使用字符指针,否则段错误是必须的。
第二段代码的错误之处就是,你使用了字符数组,但是忽略了将要被写进第一个参数的数据的大小问题。我们都知道,内存对计算机是非常宝贵的资源,所以我们不可能无限制的去申请数组的空间大小,这是不是就给我们带来了疑惑呢?我们应该怎么办?
大家要始终相信,每一个存在的事物都有它存在的道理,就像sprintf,这就顺理成章的说到了sprintf的大小限制了,第二个参数格式化字符串就可以为我们解决数组月结的问题。请看代码

int main()
{
    char a[5],c[5];
    float b = 4.000000;
    //sprintf(a,"%f",b);
    sprintf(a,"%.3f",b);
    sprintf(c,"%.2f",b); 
    printf("a is %s\n",a); 
    printf("c is %s\n",c); 
    return 0;
}

这里面c的职责依然还是监视编译器的工作。如果我们用//之后的语句,你会看到c被”挤没了“。
%.数字 格式控制符的作用就是限制将要写入字符串中的内容的大小的,所以我们使用了这个方法,就能严格的控制越界的问题了。
代码在Linux环境下C99标准下gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)下测试通过
希望大家可以批评指正,如果有好的意见和补充的地方请留言,不胜感激。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值