2014-04-27 79 views
0

我的程序應該打開一個文件,使用argv[1]從命令行檢索文件路徑。奇怪的字符串結果

然後我嘗試使用fopen打開文件,但是我的程序崩潰,因爲我使用的文件路徑不包含雙反斜槓,所以fopen不起作用。

我試圖寫我自己的轉換函數,並使用打印檢查結果看起來不錯,一見鍾情。

的問題是,當我使用返回爲const char *作爲參數,它給了我一個奇怪的結果..我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 


const char* ConvertToPath(std::string path) 
{ 
    std::string newpath = ""; 
    for(unsigned int i = 0; i < path.length(); ++i) 
    { 
     if(path[i] == '\\') 
     { 
      newpath += "\\\\"; 
     } 
     else 
     { 
      newpath += path[i]; 
     } 
    } 
    printf("%s \n", newpath.c_str()); 
    return newpath.c_str(); 
} 

bool OpenDBC(const char* path) 
{ 
    const char* file = ConvertToPath(path); 
    printf("%s \n", file); 
    FILE* dbc = fopen(file, "rbw"); 
    if (!dbc) 
     return false; 
    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("Error, expected DBC file."); 
     getchar(); 
     return -1; 
    } 

    if (!OpenDBC(argv[1])) 
    { 
     printf("There was an error opening the DBC file."); 
     getchar(); 
     return -1; 
    } 
    getchar(); 
    return 0; 
} 

打開DBC文件,我的計劃給了我以下結果:

D:\\Achievement.dbc 
a 

因此它看起來像const char* file只包含1個字符的文件路徑,爲什麼?

+6

你依賴於未定義的行爲,從本地字符串返回'c_str()'是一個非常糟糕的主意。只需返回字符串,並從'OpenDBC'中調用'c_str()'。 – Chnossos

+1

@ Chnossos的評論是正確的,但我也很好奇這個聲明:「我的程序崩潰,因爲我使用的文件路徑不包含雙反斜槓,所以fopen不起作用」。除了在程序的源代碼中指定路徑時,通常不需要轉義反斜槓。 –

+1

根本不需要'ConvertToPath',只需調用'fopen(argv [1])'並查看結果。 – CiaPan

回答

1

根本不需要ConvertToPath函數。只有字符串文字需要雙反斜槓。從來沒有像std :: string這樣的變量。

-1

我編譯Linux上的代碼,並不能複製你的結果

D:\\\\Achievement.dbc 
D:\\\\Achievement.dbc 

後來的運行./filereader "D:\\Achievement.dbc"結果

D:\\Achievement.dbc 
D:\\Achievement.dbc 

運行./filereader "D:\\\\Achievement.dbc"結果是你想要的,因爲命令是什麼行參數需要被轉義。然後你可以刪除ConvertToPath

+0

未定義的行爲可以通過很多方式表現出來:http://stackoverflow.com/a/6445794/12711 –

+0

日本人,你是對的。還有一個指針問題。 –