我的程序應該打開一個文件,使用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個字符的文件路徑,爲什麼?
你依賴於未定義的行爲,從本地字符串返回'c_str()'是一個非常糟糕的主意。只需返回字符串,並從'OpenDBC'中調用'c_str()'。 – Chnossos
@ Chnossos的評論是正確的,但我也很好奇這個聲明:「我的程序崩潰,因爲我使用的文件路徑不包含雙反斜槓,所以fopen不起作用」。除了在程序的源代碼中指定路徑時,通常不需要轉義反斜槓。 –
根本不需要'ConvertToPath',只需調用'fopen(argv [1])'並查看結果。 – CiaPan