2012-04-15 47 views
0

當我按原樣運行程序時,它工作正常。但是,當我在while循環之後移動該部分直到cout < <「pp1>」時,我得到兩個錯誤。從'char'無效轉換爲'const char *'並且初始化'char * strncpy(char *,const char *,size_t)'的參數2。任何我需要改變的想法,以便我可以將該代碼移到一個函數中。我無法在網上或在我的C++書籍中找到一個很好的解釋來解釋解決方法。我知道錯誤是說它需要一個文字而不是一個指針,但無法弄清楚工作(有沒有?)。我在將一些代碼從主函數移動到函數時遇到困難

這是我的主要。

int main(){ 
     char cmd_str[500]; 
     int length=0; 
     bool cont=true; 
    while(cont){ 

// strncpy(cmd_str, infile(), 500 - 1); this line causes the two errors 
// cmd_str[500 - 1] = '\0'; 

mode_t perms=S_IRUSR; 
int i=0; 
int fd = open("text.txt",O_RDONLY , perms); 
char *returnArray; 
    cout<<fd<<endl; 

if(fd<0){ 
    perror(strerror(errno)); 
    } else{ 
    ifstream readFile; 
    readFile.open("text.txt"); 
    readFile.seekg (0, ios::end); 
    int length = readFile.tellg(); 
    readFile.seekg (0, ios::beg); 
    returnArray=new char[i];//memory leak need to solve later 
    readFile.getline(returnArray,length); 
     cout<<returnArray<<endl; 
    strncpy(cmd_str, returnArray, length - 1); 
    cmd_str[length - 1] = '\0'; 

    } 

cout<<"pp1>"; 
cout<< "test1"<<endl; 
// cin.getline(cmd_str,500); 
cout<<cmd_str<<endl; 
cout<<"test2"<<endl; 
length=0; 
    length= shell(returnArray); 
cout<<length<<endl; 
if(length>=1) 
    { 
    cout<<"2"<<endl; 
    } 
else{ 
    cont=false; 
} 
    } 

}

這裏是我曾嘗試

char infile() 
{ 
    mode_t perms=S_IRUSR; 
int i=0; 
    int fd = open("text.txt",O_RDONLY , perms); 
    char *returnArray; 
cout<<fd<<endl; 
if(fd<0){ 
     perror(strerror(errno)); 
}else{ 
ifstream readFile; 
readFile.open("text.txt"); 
//int length = readFile.tellg(); 
readFile.seekg (0, ios::end); 
int length = readFile.tellg(); 
readFile.seekg (0, ios::beg); 
returnArray=new char[i];//memory leak need to solve later 
readFile.read(returnArray,length); 
readFile.getline(returnArray,length); 
    } 
return *returnArray; 
} 

回答

2

德引用returnArray,並試圖返回char行不通,因爲:

  1. 您將只能返回字符串的第一個字符。
  2. strncpy函數不會接受它(這就是爲什麼你會得到這些錯誤)。
  3. 您需要一種方法來取消分配char*佔用的堆分配內存。

將您的函數定義從char infile()更改爲const char* infile()並僅返回指針。這將理想地返回填充數組作爲const char*(C風格字符串),您可以成功傳遞到strncpy。另外,當你完成它時,你需要調用delete [](以防止內存泄漏)。

+0

謝謝,我總是想知道什麼const *函數被用於,永遠無法找到一個好的解釋。 – Aaron 2012-04-15 03:05:09

+0

我不是百分百肯定如何擺脫內存泄漏,因爲我從一個函數傳遞它。會寫delete [] infile();訣竅嗎?主要沒有returnArray – Aaron 2012-04-15 03:09:36

+0

啊是的,首先創建一個'const char *'變量,它接收'infile()'的輸出。然後將這個變量作爲參數傳遞給'strncpy'。然後你可以調用'delete []'。 – 2012-04-15 03:15:03

0

哇靠,修改代碼(使它看起來更清潔,即縮進),你可能會得到更多的響應的功能。我看到兩件事:while循環的括號和現在的函數return-type是一個字符,你正在尋找返回一個char *。

+0

我正在第一次使用emacs,在emacs中縮進沒問題。但是,當我在這裏複製它似乎變得相當sl。。 – Aaron 2012-04-15 02:41:15

0

首先,你的infile函數返回一個char,而strncpy需要一個const char *,這基本上意味着它需要一個c字符串(或char數組)。

相關問題