我剛剛開始使用C++進行編程,並且發現了一個尷尬的問題。基本上:C++類成員充當本地變量
- 我有一個類的成員是一個
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()' - 找出一個字符(而不是一個字符的字符串)的最右邊。請注意,您可能需要擔心帶有尾部斜線('strrchr()'或'strstr()')的'「/ abc/def/ghi //」'。不過,總的來說,你似乎發現人們推薦C++中不使用C風格字符串的原因之一。他們很容易被濫用。 –