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語言》(第三版)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章