自制Shell实现mkdir功能时strcmp判断不生效的原因是什么?
问题原因
- 核心错误是
strcmp返回值逻辑用反:C标准库中strcmp(str1, str2)的返回值规则为:两个字符串完全相等时返回0,str1字典序大于str2返回正整数,小于则返回负整数。你当前代码写的if(strcmp(line[0], "mkdir"))等价于if(返回值!= 0),也就是只有第一个输入单词不等于mkdir时才会进入分支,刚好和需求相反。 - 次要潜在问题:未校验
sscanf的匹配结果,如果用户只输入mkdir没有加目录参数,line[1]会是未初始化的垃圾值,后续拼接路径会触发内存访问异常,甚至程序崩溃。 - 还有一处不规范写法:直接使用
printf(path)输出路径,如果路径名中包含%等格式化占位符,会触发非法内存访问,存在安全隐患。
修复方案
- 修正
strcmp的判断条件,明确判断返回值是否为0:if(strcmp(line[0], "mkdir") == 0) - 接收
sscanf的返回值,校验成功匹配的参数个数,确认参数合法后再执行后续逻辑 - 把直接输出路径的写法改为格式化输出,避免安全问题
修复后可运行代码
//#include "parser.c" #include <stdio.h> #include <sys/stat.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #ifndef MAX_BUF #define MAX_BUF 200 #endif int main(void) { while (1) { printf("Enter a command: "); char input[20]; char line[4][20] = {0}; // 初始化数组避免垃圾值 fgets(input, 20, stdin); // 校验sscanf匹配成功的参数个数 int arg_cnt = sscanf(input, "%s %s", line[0], line[1]); // 修正strcmp判断逻辑 if(arg_cnt >= 1 && strcmp(line[0], "mkdir") == 0) { if(arg_cnt < 2) { printf("mkdir: 缺少目录名参数\n"); continue; } char path[MAX_BUF] = {0}; getcwd(path, MAX_BUF); strcat(path, "/"); strcat(path, line[1]); mkdir(path, 0700); // 改用格式化输出避免安全问题 printf("已创建目录:%s\n", path); } } return 0; }
内容的提问来源于stack exchange,提问作者Kian Bianco
相关产品推荐
相关产品推荐

