最近寫了點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,就會把原先的正常資料覆寫掉,是以記得在第二行末尾回個車。