如何使用C语言创建名称未知或用户指定的目录(%s方式无效)
解决C语言中动态指定目录名创建目录的问题
嘿,你可能是把格式化字符串的用法(比如printf里的%s)和系统调用的参数传递搞混啦!其实mkdir()根本不需要用%s,它的参数是一个*const char*类型的字符串指针*——不管这个字符串是固定的字面量(比如"hello")还是动态生成/用户输入的变量,只要是合法的C字符串,都可以直接传进去。
下面分几种常见场景给你具体示例:
场景1:用预定义的字符串变量创建目录
如果目录名已经存储在变量里,直接把变量传给mkdir就行:
#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> int main() { // 定义存储目录名的变量 const char* dir_name = "my_custom_dir"; // 第二个参数是目录权限,0755是常用的权限设置(八进制) int create_result = mkdir(dir_name, 0755); // 检查创建是否成功 if (create_result == -1) { perror("创建目录失败"); // 打印具体错误原因 return 1; } printf("目录%s创建成功!\n", dir_name); return 0; }
场景2:接收用户输入的目录名
如果目录名由用户从终端输入,先把输入内容读取到字符数组中,再传给mkdir:
#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <string.h> int main() { char dir_name[256]; // 定义足够大的数组存储输入内容 printf("请输入要创建的目录名:"); // 用fgets读取输入(比scanf更安全,避免缓冲区溢出) if (fgets(dir_name, sizeof(dir_name), stdin) == NULL) { perror("读取输入失败"); return 1; } // 去掉fgets自动读取的换行符(避免目录名带换行) dir_name[strcspn(dir_name, "\n")] = '\0'; int create_result = mkdir(dir_name, 0755); if (create_result == -1) { perror("创建目录失败"); return 1; } printf("目录%s创建成功!\n", dir_name); return 0; }
场景3:动态拼接目录名
如果需要动态生成目录名(比如拼接前缀+变量值),可以用snprintf安全生成完整字符串后再调用mkdir:
#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <string.h> int main() { int user_id = 456; char dir_name[256]; // 用snprintf拼接字符串,避免缓冲区溢出 snprintf(dir_name, sizeof(dir_name), "user_folder_%d", user_id); int create_result = mkdir(dir_name, 0755); if (create_result == -1) { perror("创建目录失败"); return 1; } printf("目录%s创建成功!\n", dir_name); return 0; }
几个注意点:
- 必须包含头文件
sys/stat.h和sys/types.h,否则mkdir会报错; mkdir的第二个参数是八进制权限值,一定要加前缀0(比如0755),不能直接写755(那是十进制);- 一定要检查
mkdir的返回值:返回0表示成功,返回-1表示失败,用perror可以打印具体错误(比如目录已存在、权限不足等)。
内容的提问来源于stack exchange,提问作者darya life
相关产品推荐
相关产品推荐

