如何解决生成没有参数的主要参数
在C编程语言中,是否可以在不使用参数的情况下访问int argc
或char **argv
?我知道你们中的一些人可能会问为什么需要这样做,只是为了研究目的。
是否可以在不使用主参数变量的情况下生成 cmd 行参数?例如,为了说明我想到的一些伪代码,
LPTSTR cmd = GetCommandLine();
splitted = cmd.split(" ") //split from spaces
char **someArgv.pushForEach Splitted,length++
并且您有一个带参数的 someArgv
和 length
为 argc
,如果可能的话,这真的有助于了解说明。
解决方法
如果 OP already has 命令作为字符串,则:
-
形成字符串的副本
-
解析它以获得参数计数
-
为
argv[]
分配 -
为每个
argv[]
解析和标记化副本 -
致电
main()
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
// Not standard,but commonly available
char *strdup(const char *s);
// Return length of token and adjust offset to the next one
// Adjust as needed
// Presently only ' ' are used to separate
// More advanced would have escape characters,other white-space,etc.
size_t tokenize(const char *s,size_t *offset) {
// find following space
size_t len = strcspn(s + *offset," ");
*offset += len;
// find first non-space
*offset += strspn(s + *offset," ");
return len;
}
int call_main(const char *cmd) {
char *cmd2 = strdup(cmd);
cmd2 += strspn(cmd2," "); // skip leading spaces
size_t offset = 0;
int argc = 0;
while (tokenize(cmd2,&offset) > 0) {
argc++;
}
char **argv = malloc(sizeof *argv * ((unsigned)argc + 1u));
offset = 0;
for (int a = 0; a < argc; a++) {
argv[a] = &cmd2[offset];
size_t len = tokenize(cmd2,&offset);
argv[a][len] = '\0';
}
argv[argc] = NULL;
int retval = 0;
#if 0
retval = main(argc,argv);
#else
printf("argc:%d argv:",argc);
for (int a = 0; a < argc; a++) {
printf("%p \"%s\",",argv[a],argv[a]);
}
printf("%p\n",argv[argc]);
#endif
free(cmd2);
free(argv);
return retval;
}
样品
int main() {
call_main(" name 123 abc 456 ");
}
argc:4 argv:0x800062322 "name",0x800062327 "123",0x80006232c "abc",0x800062331 "456",0x0
Pedantic:提供给 main()
的字符串应该是可修改的。避免像
argv[1] = "Hello";
....
main(argc,argv);
,
#include <stdio.h>
int main(int argc,char *argv[]);
int callMain(void)
{
char *argv[4];
argv[0] = "binary";
argv[1] = "param1";
argv[2] = "param2";
argv[3] = NULL;
return main(3,argv);
}
int main(int argc,char *argv[])
{
if (argc <= 1)
{
return callMain();
}
printf("ARGC: %u\n",argc);
int i;
for (i = 0; i < argc; i++)
printf("ARG: %u - %s\n",i,argv[i]);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。