本文是自己在工作中遇到的一些有關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語言》(第三版)