代码
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
string getAppPath(char *argv0)
{
string result = "";
#ifdef WIN32
FILE *fl = popen("chdir", "r");
string slash = "\\";
#else
#ifdef linux
FILE *fl = popen("pwd", "r");
string slash = "/";
#endif
#endif
char workspace[256];
int len = fread(workspace, 1, 256, fl);
pclose(fl);
workspace[len-1] = '\0';
#ifdef WIN32
if(strchr(argv0, ':'))
{
result = string(argv0);
}
#else
#ifdef linux
if(argv0[0] == '/')
{
result = string(argv0);
}
#endif
#endif
else
{
result = string(workspace)+slash+string(argv0);
}
int t;
while((t=result.find(slash+"."+slash)) != -1)
{
result.replace(t, 3, slash);
}
while((t=result.find(slash+".."+slash)) != -1)
{
int ft = result.rfind(slash, t-1);
result.replace(ft, t-ft+3, "");
}
while((t=result.find(slash+slash)) != -1)
{
result.replace(t, 2, slash);
}
return result;
}
int main(int argc, char *argv[])
{
cout<<getAppPath(argv[0])<<endl;
return 0;
}
windows和linux都能用
一些解释
#ifdef是预处理,我用来判断编译器是windows系统还是linux系统。因为编译器在编译时就会自动预定义一些宏:如果是windows系统,编译器会定义一个WIN32,而不会定义linux;如果是linux系统,编译器会定义一个linux而不会定义WIN32。所以只需要判断编译器预定义了WIN32还是linux就可以判断操作系统了。
程序的原理是,先用终端获取到当前目录,然后如果C++程序的argv[0]不是全路径,则返回当前目录+斜杠+argv[0],当然返回前还要规范一下,比如点斜杠这种要去掉;如果argv[0]是全路径,这直接返回argv[0]即可。