无法从 C 中的主函数读取 argv[2]

can't read argv[2] from main function in C

我正在尝试使用 stdlib.h 中的 system() 函数 运行 java jar,但我无法打印 argv[2] 这是代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    char command[] = "java -jar lans.jar ";
    char space[] = " ";

    if (argc == 2)
    {
        char* option = argv[1];
        strcat(command, option);
        printf(command);
        system(command);
    }
    else if (argc == 4)
    {
        char* option = argv[1];
        strcat(option, space);

        char* ip = argv[2];
        strcat(ip, space);

        char* file = argv[3];
        strcat(file, space);

        strcat(command, option);
        strcat(command, ip);
        strcat(command, file);
        printf(command);
        system(command);
    }
    else
    {
        printf("wrong args\n");
        system(command);
    }
}

这是输出

PS C:\Users\Josep\Dev\C> .\bin\lans.exe arg1 arg2 arg3
        option                            use
        ------------------------------------------
        -s [target ip] [file name]          send a file (no need to write the full path if the file is in working directory
        -r                                  start receiving files
java -jar lans.jar arg1   arg3

argv2 不见了,我也不知道为什么。

我写的 C 代码不多。有帮助吗?

  1. 给数组增加一些额外的长度command
  2. 使用 argv 中的直接值来准备命令。
char command[1024] = "java -jar lans.jar ";
......
else if (argc == 4) {
    strcat(command, argv[1]);
    strcat(command, space);
    strcat(command, argv[2]);
    strcat(command, space);
    strcat(command, argv[3]);
    printf(command);
    system(command);
}
.....

你在没有space可写的地方写作。 argv 中的缓冲区与它们需要的长度完全一样。或者,这是您唯一可以指望的事情。您永远无法安全地连接到它们。通常,将它们视为只读是个好主意。

这是一个为所有参数分配足够的片段:

int main(int argc, char **argv) {
    int totlen = 0;
    char *buf;

    for(int i=0; i<argc; i++) 
        totlen += strlen(argv[i]) + 1; // +1 for space

    buf = malloc(totlen + 1); // +1 for zero terminator

    if(!buf) exit(1); // If malloc failed

    buf[0] = 0; // Or else first strcat may cause trouble

    for(int i=0; i<argc; i++) {
        strcat(buf, argv[i]);
        strcat(buf, " ");
    }

    printf("%s\n", buf);

    free(buf);
}

在此之后,buf 将足以容纳传递给程序的所有参数,每个参数之间有一个 space。该程序将打印传递给它的所有参数。

假设,作为一个思想实验(没有关于它的规则),argv[0]argv[1]、...在内存中都是连续的...

所以你在内存中的某个地方有数据

    // 0 is the '[=10=]' string terminator
    executable.exe0arg10arg20arg30 ...
    ^              ^    ^    ^ argv[3]
    ^              ^    \----  argv[2]
    ^              \---------  argv[1]
    \------------------------  argv[0]

然后是你的代码

    char* option = argv[1];
    strcat(option, space);

注意指针argv[]没有改变

    // 0 is the '[=12=]' string terminator
    executable.exe0arg1 0rg20arg30 ...
    ^              ^    ^    ^ argv[3]
    ^              ^    \----  argv[2]
    ^              \---------  argv[1]
    \------------------------  argv[0]

argv[2] 现在指向 '[=18=]' 字符串终止符,它在 strcat() 操作后放在那里

    char* ip = argv[2];

ip 也指向一个 '[=18=]' 字符串终止符