本文是自己在工作中遇到的一些有关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 = 0;
char 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语言》(第三版)