C语言中,需要获取程序的当前工作目录,或者获取程序自身所在的目录。这对于读取文件、配置路径等操作非常有用。不同操作系统和平台的实现方式有所不同,因此需要根据平台来选择合适的方法。

1、使用 argv[0] 和 realpath()(Linux/Unix 类系统)

在 Linux/Unix 系统中,程序的路径通常可以通过 argv[0] 获取,该参数包含了程序启动时传递的路径。为了获取程序所在目录,可以使用 realpath() 函数将路径解析成绝对路径。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libgen.h>  // dirname

int main(int argc, char *argv[]) {
    char path[1024];
    char *real_path;

    // 获取 argv[0] 的路径
    real_path = realpath(argv[0], path);

    if (real_path != NULL) {
        // 获取目录部分
        char *dir = dirname(path);
        printf("Program is running from: %s\n", dir);
    } else {
        perror("Error resolving real path");
    }

    return 0;
}

2、使用 GetModuleFileName()(Windows 系统)

在 Windows 系统中,可以使用 GetModuleFileName()来获取当前程序的路径。

#include <stdio.h>
#include <windows.h>

int main() {
    char path[MAX_PATH];
    DWORD result = GetModuleFileName(NULL, path, MAX_PATH);
    
    if (result > 0) {
        // 获取目录部分
        char *dir = path;
        for (int i = strlen(path) - 1; i >= 0; i--) {
            if (path[i] == '\\') {
                path[i] = '\0';  // 将路径分隔符替换为字符串结束符
                break;
            }
        }
        printf("Program is running from: %s\n", path);
    } else {
        printf("Failed to get module file name\n");
    }

    return 0;
}

3、使用 getcwd()(获取当前工作目录,适用于所有平台)

如只需要当前工作目录(即程序启动时所在的目录,而不是程序的实际路径),可以使用 getcwd() 来获取。

#include <stdio.h>
#include <unistd.h>

int main() {
    char cwd[1024];

    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("Current working directory: %s\n", cwd);
    } else {
        perror("getcwd failed");
    }

    return 0;
}

4、使用 __FILE__ 宏

__FILE__ 是一个预定义宏,它包含了源文件的路径,可以通过它来获取当前源代码文件所在的路径。

#include <stdio.h>

int main() {
    printf("Current file path: %s\n", __FILE__);
    return 0;
}