天天看點

char **指派 strtok feof fgets使用小記

最近寫了點C++ C的代碼,手生了,還是有很多需要注意的地方的

1.     char **類型的指派問題

char ** strarry;

strarry=(char**)malloc(sizeof(char *)*MAX_NUM);

//這一句很重要,對于指針一定要記得給它配置設定記憶體空間

strarry[i++]=q;(q是char *類型)

也就是說,可以把它當做數組處理,逐個指派,每個值都是char *類型

然後不要忘記free,

如果new了的話不要忘記delete

2.    strtok包含在<string.h>裡面,用來分割字元串,其常用用法如下:

char*q=strtok(labelFeature,"|");
 while(q!=NULL)

       {

          mpLabelPolicy->labelFeatures[i++]=q;

          q=strtok(NULL,"|");

       }
           

strtok是個别扭的函數,它會改變原先的字元串,比如bob|tom|mary,分割後原字元串變為bob\0tom\0mary,它含有一個内部靜态指針this,第一次調用strtok後,this會指向分割後剩餘的字元串,即tom|mary,第二次調用時,第一個參數設為NULL,則預設的是用this指針,是以可以繼續分割下去

3.     feof這是個很奇怪的函數,有人說這個函數就是個“蛇足”

while(!feof(labelfd)){

fgets(labelPolicy,150,labelfd);

}
           

比如檔案裡面有兩行資料(最後一行沒有加回車符),那麼兩次fgets以後,調feof傳回的是仍是false,導緻多讀一次,而實際上在這額外的一次循環裡,fget的傳回值是NULL,表示檔案結束或者讀錯誤。所示可以改為

while(!feof(labelfd)){

if(fgets(labelPolicy,150,labelfd)==NULL)

       break;

}
           

4.     fgets函數在讀檔案時,會把一行最末尾的換行符也讀進去,比如檔案内容

aaaaaa

bbbbbbbb

那麼在fgets(labelPolicy,150,labelfd)後,labelPolicy裡放的是aaaaaa\n\0

是以如果想對labelPolicy做操作,可以把\n換為\0

labelPolicy[strlen(labelPolicy)-1]='\0'

但這樣做有個問題,如果第二行結束後沒有按回車,那麼用fgets讀到的第二行資料就沒有\n,此時如果還是把\n替換為\0,就會把原先的正常資料覆寫掉,是以記得在第二行末尾回個車。