You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制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)输出路径,如果路径名中包含%等格式化占位符,会触发非法内存访问,存在安全隐患。
修复方案
  1. 修正strcmp的判断条件,明确判断返回值是否为0:if(strcmp(line[0], "mkdir") == 0)
  2. 接收sscanf的返回值,校验成功匹配的参数个数,确认参数合法后再执行后续逻辑
  3. 把直接输出路径的写法改为格式化输出,避免安全问题
修复后可运行代码
//#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:15:00