You need to enable JavaScript to run this app. 如何用C制作Win10 cmd可调用带参数的print.exe并修复输出(null)问题
优惠活动
大模型
产品
解决方案
定价
更多

如何用C制作Win10 cmd可调用带参数的print.exe并修复输出(null)问题

问题根源
  • 代码中循环边界的取值逻辑存在本质错误:int forparam = sizeof(argv); 拿到的根本不是参数数量。argv作为main函数的入参,本质是指向命令行参数字符串数组首地址的指针,在32位编译环境下这个值固定为4,64位环境下固定为8,和实际传入的参数个数没有任何关联。
  • 因为这个错误的边界值,32位编译出的程序循环会固定遍历i=1、2、3几个下标:当访问超出实际有效参数范围的下标时,读到的是系统在参数列表末尾预留的NULL空指针,直接将空指针作为%s的参数传给printf,就会输出异常的(null)字符串,同时表现为最多只能正常接收3个有效参数的现象。
修复方案

循环边界直接使用main函数自动统计的argc值即可——这个变量由运行环境自动填充,记录了所有命令行输入内容(包含程序自身文件名)的总个数,其中用户实际传入的参数下标范围为1到argc-1,不存在越界风险。同时原代码中未实际使用的<Windows.h>头文件可以直接移除,减少不必要的依赖。
修复后的完整代码如下:

#include <stdio.h>

int main(int argc, char* argv[]) {
    // 无有效传入参数时输出提示
    if (argc < 2) {
        printf("One argument expected\n");
        return 0;
    }

    for (int i = 1; i < argc; i++) {
        // 第一个参数直接输出,后续参数前补空格做分隔
        if (i == 1) {
            printf("%s", argv[i]);
        } else {
            printf(" %s", argv[i]);
        }
    }
    // 末尾补换行,匹配cmd的显示习惯,避免输出和提示符挤在同一行
    printf("\n");
    return 0;
}
修复后效果
  • 彻底消除越界访问带来的(null)输出异常
  • 支持任意数量的传入参数,不管是1个还是10个参数,都能按空格分隔的规则完整打印
  • 输出行为和系统原生的echo命令保持一致,适配cmd终端的显示逻辑

内容的提问来源于stack exchange,提问作者Mauser_Maschine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 02:06:04