无法从 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 代码不多。有帮助吗?
- 给数组增加一些额外的长度
command
- 使用
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=]'
字符串终止符
我正在尝试使用 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 代码不多。有帮助吗?
- 给数组增加一些额外的长度
command
- 使用
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=]'
字符串终止符