C程序,打印其可执行文件名

sid*_*uff 5 c c++

假设源代码文件名是test.cpp.编译时,它会生成test.exe文件.当我执行它时,它应该识别它的文件名test.exe并打印它.

我可以使用以下代码获取当前目录中存在的所有文件和目录的列表:

DIR * directory;
struct dirent * direct;
direct = readdir(directory);
Run Code Online (Sandbox Code Playgroud)

但是,如何识别相关的文件名,在这种情况下是哪个"test.exe"

gal*_*tte 16

在main函数中,argv[0]是命令行中可执行文件的名称

#include <stdio.h>
int main(int argc, char ** argv)
{
    printf("%s", argv[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现场演示

这将打印命令名称,即相对于当前工作目录的目录,以及可执行文件名称(如果可用,这是不可保证的)要获取当前工作目录,请使用getcwd()标准库C函数.

从命令路径中提取文件名argv[0]是特定于平台的:unix使用斜杠' /',windows允许混合使用斜杠/和反斜杠\,而任何其他平台都可以使用任何其他路径分隔符.从路径中提取文件名需要跨平台库,例如Qt或Boost.在POSIX环境中,可以使用basename.

  • argv [0]是您的命令,不一定是可执行文件的名称 (3认同)

Dav*_*eri 11

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%s\n", argv[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的程序可以启动为:

/home/user/./app
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使用strrchr以下命令获取名称:

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

int main(int argc, char *argv[])
{
    char *appname;

    appname = strrchr(argv[0], '/'); /* '\\' on Windows */
    printf("%s\n", appname ? ++appname : argv[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*nze 6

您在构建可执行文件时知道它的名称; 最简单的解决方案是将其嵌入到程序中,使用-D/D 选项在命令行上定义宏.

除此之外,通用答案是不可能的:

根据标准

  • argv[0]应该包含用于调用程序的名称(无论这意味着什么).哪个好,但1)它甚至不能在Unix下实现,2)在大多数系统中,存在各种别名,这意味着用于调用程序的名称与可执行文件的名称无关.

在Windows下

  • 有一个系统函数GetModuleFileName可用于获取可执行文件的路径.获得路径后,路径的最后一个元素就是可执行文件的名称.

在Unix下

  • 这根本不可能.在启动一个新进程时,Unix会为可执行文件的路径采用单独的参数,并为最终进程提供参数argv[0],因此它们可能彼此之间没有任何关系.这一切都取决于谁开始你的过程. bash将在环境变量中放置可执行文件的完整路径"_",以便您可以使用getenv它来获取它.但这只适用于您的程序启动时bash.在大多数Unices上,你也可以在/proc文件系统中找到它 ,如果你知道你的方式; 但是这种组织方式因Unix而异.另请注意,由于硬链接,您可执行文件可能没有一个名称.

真正的问题是你想要这样做的原因.你想解决的问题是什么?