Linux下C代码开发中遇到的问题集锦

  本文是自己在工作中遇到的一些有关C代码开发中的一些问题的整理。并不完整,但后续可能会继续慢慢的积累。

1、复制函数

  memcpy是拷贝内存中的区域,不止可以复制字符串,拷贝时不会在末尾添加’\0’。
  strcpy只能拷贝字符串,拷贝时会拷贝末尾的终止的空字符,并且遇到’\0’就结束。

char *strncpy(char *s1,const char *s2,size_t n);

  1)函数strncpy从s2指向的数组中复制最多n个字符(不复制空字符后面的字符)到s1指向的数组中。
  2)如果s2指向的数组是一个长度比n短的字符串,则在s1指向的数组后面添加空字符,直到写入了n个字符。

  因为系统在定义结构体中字段长度的时候,都是长度+1,针对这种情况

memcpy(tTblHceAppleCardInfo.pan,tTblApplepayCardApply.pan,sizeof(tTblApplepayCardApply.pan));/*是对的,连同字段结束符一同拷贝*/
memcpy(tTblHceAppleCardInfo.pan,tTblApplepayCardApply.pan,sizeof(tTblApplepayCardApply.pan)-1);//是不对的

  而strncpy的字符串拷贝也应同memcpy,拷贝长度不应-1,具体可用man查看strncpy函数的实现。


2、void *memset(void *s,int c,size_t n)

  memset函数将s所指向的某一块内存中的每个字节的内容全部设置为c指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。
注意:
  1、参数value虽声明为int,但必须是unsigned char,所以范围在0到255之间。
  2、另外,在给char以外的数组赋值时,只能初始化为0或者-1。因为在计算机里,0的二进制都是0,-1的二进制都是1。

针对字符串的初始化

char sInitQuota[12 + 1] = {0};

  针对上面的初始化,从意义上来说没有错,但是建议采用这样的方式初始化

memset(sInitQuota,0x00,sizeof(sInitQuota));

  因为更常用些,不仅可以在声明的时候初始化,在需要的时候也可以进行值的设定。另外据说用memset更快一些。

  至于0x00和0,他们的结果都是一样的,由ASCII码表就知道啦,都是0,表示空字符(NUL)。但写成0x00有两个好处:
  1、0是int型的,占4个字节,memset(str,0,sizeof(str));时,只会保留0的低8位,用0x00看的更明显些,体现了一个移植性。
  2、0x00强调就是数字0,就是为了ASCII码转换的数字0,不是字符‘0’,避免手误把数字0写成字符‘0’,这样就达不到用‘\0’清空字符串的目的了。


3、字符串不能用memset来修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char str[] = "http://c.biancheng.net";
    //不可以声明为char *str = "http://c.biancheng.net";
    memset(str,'-',7);//'-'减号/破折号,ASCII码对应的十进制数是45。
    puts(str);

    system("pause");
    return EXIT_SUCCESS;
}

执行结果:
——-c.biancheng.net
注意:字符数组是可以被修改的,字符串是只读的,不能被修改,而memset()又必须修改str,所以不能将char str[] = “http://c.biancheng.net“;声明为char *str =
http://c.biancheng.net“;,否则运行时会报错。


4、关于代码的缩进

建议采用每个缩进四个空格的形式
例如:

if(iCount == 0)
{
    return 0;
}

5、参数的定义

  不要出现这种形式的定义:

int    rc;

  建议针对整形的都是n或者i开头,字符串的都是s或者ch开头,float的都是f开头,double的都是d开头依次类推。例如:

int    nRc = 0char   chNum[12+1];
double dAmt=0.00;

  同时建议在定义的时候,参数的首字母是对齐的,各个类型定义到一块,例如上面定义的三个参数的首字母是对齐的;
  不要出现这种形式:

   int nRc = 0;
   char  chNum[12];
   doubel dAmt=0.00;

  在同一个项目中同一种风格


6、日志的打印:

  日志的打印,针对交易主键信息,或者说出问题能够根据该值确定问题的关键值,建议采用INFO正常日志级别,针对具体的明细值建议DEBUG调试模式,错误的要明确ERROR报错级别。


7、不可将浮点变量用”==”或”!=”与任何数字比较。

  浮点数不能直接比相等,计算机对浮点数的进行计算的原理是只保证必要精度内正确即可,所以小数点最后有些位是不准确的。
  要比较相等,不能直接用==来判断,只看两数差值在一定精度范围内,就可以认为相等。

#include <math.h>
double fabs(double x)
Link with -lm.
    //—— 林锐《高质量程序设计指南——C++/C语言》(第三版)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值