如何用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
相关产品推荐
相关产品推荐

