C++でのプログラミングを開始したばかりですが、厄介な問題が見つかりました。基本的に:ローカル変数として動作するC++クラスメンバ
- 私は1つのクラスを持っています。メンバーはファイルのフルパスを含む
char[MAX_LEN]
です。 - ファイルのフルパスを除いた名前を指しています(
char*
)。
このクラスを作成したとき、(char*
)ポインターが実際にコンストラクター内のローカル変数を指していることがわかり、誤った結果が得られました。
正確には、クラスがある:
class File_t{
public:
char fullPath[1024];
char* name;
File_t(){}; // Default constructor
File_t(const char* fullPath_){
/* Copy the input name on fullPath */
strncpy(fullPath, fullPath_, sizeof(fullPath));
/* Auxiliary variable to remove the path */
char* auxstr=fullPath;
name = auxstr;
/* Loop to remove the path */
while(1){
auxstr = strstr(auxstr,"/");
if(auxstr){auxstr=auxstr+1; name=auxstr;}
else{break;}
}
}
};
そして、例えば、メインは「するfile_t」の複数のインスタンスを作成して構成されており、いくつかのファイル/いくつかの/パス/ foo1,2でいっぱい、...
int main(int argc, char* argv[]){
const int N = 3;
File_t CC[N];
char fileName[100];
for (int i = 0; i < N; i++){
sprintf(fileName,"%s%d","some/path/foo",i);
CC[i] = File_t(&fileName[0]);
}
cout << "Summary" << endl;
for (int i=0; i<N; i++) cout << "File " << CC[i].name << " in " << CC[i].fullPath << endl;
return 0;
}
プログラムの出力は次のようになります。
いくつかのローカル変数に、名前がポイントにあるFile foo2 in some/path/foo0
File foo2 in some/path/foo1
File foo2 in some/path/foo2
コンストラクタ私はApple、GNU、Intelコンパイラにこの問題があります。
PS:C++でCスタイルの文字列を使用しないようにすべきだと知っていますが、これはC++の基本を学ぶために作られたものです。
'strncpy'を使用しないでください。 – melpomene
ご意見ありがとうございます。私はstrcpyを試しても問題は解決しません。ご回答有難うございます! –
'strstr()'を使用する代わりに、 'strrchr()'を使う - 1文字の文字列の代わりに、文字の右端の文字列を見つける。''/abc/def/ghi // ''に '' strrchr() ''や '' strstr() ''をつけて)心配する必要があるかもしれないことに注意してください。しかし一般的には、C++でCスタイルの文字列を使用しないことを人々が推奨する理由の1つを見つけたようです。彼らは簡単に誤用される。 –