"int main(int argc, char **argv)"型控制台程序的改造

有时候网上下载些开源代码,是用控制台程序写的,其入口程序接收命令行输入,且后续程序依据用户输出做处理,形如"int main(int argc, char **argv)"。

这种程序如果要移植到别的地方并不是太方便,因此需要做改造。本人遇见这种情况一般的做法是直接将涉及到"int argc, char **argv"这两个变量的代码全部替换成别的,然后把入口函数改成"int main()"。

在大多数情况下这样也就OK了,然而当遇到一些大工程则比较崩溃,单单换这些变量还有查找可能造成的后果就需要花大量的时间,有时还会带入一些雷。最近在做YOLO的改造就出现了这种情况,因此想直接在程序内部定义跟"int argc, char **argv"这两个东西完全一致的变量,并对它们进行赋值,来模拟命令行输入的状态。

一开始本人是这么写的

int main()
{
    int argc = 11;
    char argv[11][100];
    ...
}

结果后面程序报错,这个时候本人才发现"**argv"这个指针数组里面的指针所指字符串的长度是不一致的,不能直接给它限定死。因此需要将程序改造成如下的形式

int main()
{
    int argc = 11;
    char argv0[] = "xxx";
    char argv1[] = "xxx";
    char argv2[] = "xxx";
    char argv3[] = "xxx";
    char argv4[] = "xxx";
    char argv5[] = "xxx";
    char argv6[] = "xxx";
    char argv7[] = "xxx";
    char argv8[] = "xxx";
    char argv9[] = "xxx";
    char argv10[] = "xxx";
    char **argv = (char**)malloc(sizeof(char*) * 11);
    argv[0] = argv0;
    argv[1] = argv1;
    argv[2] = argv2;
    argv[3] = argv3;
    argv[4] = argv4;
    argv[5] = argv5;
    argv[6] = argv6;
    argv[7] = argv7;
    argv[8] = argv8;
    argv[9] = argv9;
    argv[10] = argv10;
    ...
}

这样改了之后就跟命令行直接输入一致了。

猜你喜欢

转载自blog.csdn.net/oHanTanYanYing/article/details/81450263