0

プログラムをそのまま実行すると、正常に動作します。ただし、whileループの直後にcout << "pp1>"までセクションを移動すると、2つのエラーが発生します。'char'から'constchar *'への無効な変換、および'char * strncpy(char *、const char *、size_t)'の引数2の初期化。そのコードを関数に移動できるように、何を変更する必要があるかについてのアイデア。オンラインまたはc++の本で、これを回避する方法を説明する適切な説明を見つけることができません。エラーがポインタの代わりにリテラルが必要であると言っていることは知っていますが、回避策を理解できません(1つありますか?)。

これが私のメインです。

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; 
}
4

3 に答える 3

2

aを逆参照returnArrayして返そうとしても、次の理由からうまくいきませんchar

  1. 文字列の最初の文字のみを返します。
  2. 関数はそれstrncpyを受け入れません (これが、これらのエラーが発生する理由です)。
  3. が占有するヒープ割り当てメモリの割り当てを解除する方法が必要ですchar*

関数定義を からchar infile()に変更const char* infile()し、ポインターだけを返します。これは理想的には、正常const char*に渡すことができる (C スタイルの文字列)として埋められた配列を返しますstrncpy。さらに、使い終わったら、それを呼び出す必要がありますdelete [](メモリ リークを防ぐため)。

于 2012-04-15T02:55:48.257 に答える
0

なんてこった、コードを修正して(インデントをきれいに見せる)、より多くの応答が得られるかもしれません。私が見ている2つのこと:whileループの括弧と現在、関数の戻り値の型は単一の文字であり、char *を返そうとしています。

于 2012-04-15T02:37:04.010 に答える
0

まず、infile 関数は char を返しますが、strncpy には const char * が必要です。これは基本的に、ac 文字列 (または char 配列) が必要であることを意味します。

于 2012-04-15T03:03:07.727 に答える