迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 语言中获取当前工作目录

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将介绍几种在 C 语言中获取当前工作目录的方法。


使用 getcwd 函数获取当前工作目录的方法

getcwd 函数是一个符合 POSIX 标准的系统调用,可以检索调用程序的当前工作目录。getcwd 需要两个参数 - char* 缓冲区,其中存储路径名,以及给定缓冲区中分配的字节数。该函数将当前工作目录的名称存储为一个空头字符串,用户有责任保证 char* 地址有足够的空间来存储路径名。注意,getcwd 返回的是目录的绝对路径名。

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

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
    char path[MAX_BUF];

    getcwd(path, MAX_BUF);
    printf("Current working directory: %s\n", path);

    exit(EXIT_SUCCESS);
}

在 C 语言中正确验证 getcwd 函数返回的值以获取当前工作目录

getcwd 函数可能无法检索到正确的值;因此,在这种情况下,它返回 NULL,并设置 errno 与相应的错误代码。用户负责实现错误检查代码,并根据需要修改程序的控制流程,以适应特定情况。需要注意的是,我们在调用 getcwd 函数之前将 errno 显式地设置为零,因为最好的做法是在调用到答应设置 errno 的库函数之前设置。如果 size 参数小于工作目录的路径名,errno 会被设置为 ERANGE

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

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
    char path[MAX_BUF];

    errno = 0;
    if (getcwd(path, MAX_BUF) == NULL) {
        if (errno == ERANGE)
            printf("[ERROR] pathname length exceeds the buffer size\n");
        else
            perror("getcwd");
        exit(EXIT_FAILURE);
    }
    printf("Current working directory: %s\n", path);

    exit(EXIT_SUCCESS);
}

另外,我们也可以将 NULL 值作为第一个参数传递给 getcwd 函数,0 作为第二个参数。函数本身会使用 malloc 动态分配一个足够大的缓冲区,并返回指向该位置的 char 指针。注意,用户应该在返回的指针上调用 free 函数来重新分配缓冲区内存。

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

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
    char path[MAX_BUF];

    errno = 0;
    char *buf = getcwd(NULL, 0);
    if (buf == NULL) {
        perror("getcwd");
        exit(EXIT_FAILURE);
    }
    printf("Current working directory: %s\n", buf);
    free(buf);

    exit(EXIT_SUCCESS);
}

使用 get_current_dir_name 函数获取当前工作目录

get_current_dir_name 是另一个可以检索当前工作目录的函数。注意这个函数需要定义 _GNU_SOURCE 宏,否则代码很可能会出现编译错误。get_current_dir_name 不接受参数,返回 char 指针,类似于 getcwd 函数。内存是用 malloc 自动分配的,调用者的代码负责释放返回的指针。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
    char path[MAX_BUF];

    errno = 0;
    char *buf = get_current_dir_name();
    if (buf == NULL) {
        perror("get_current_dir_name");
        exit(EXIT_FAILURE);
    }
    printf("Current working directory: %s\n", buf);
    free(buf);

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在C中将整数转换为字符

发布时间:2024/01/03 浏览次数:131 分类:C语言

本教程介绍了在C中将整数转换为字符的不同方法。在C编程语言中,将整数转换为字符在各种情况下都很重要。在C中,字符是以ASCII值表示的,因此转换过程相对简单。

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:364 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:167 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:158 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:129 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:177 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:212 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:131 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:267 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便