【问题标题】:generating main arguments without the parameter生成没有参数的主要参数
【发布时间】:2021-05-07 16:01:46
【问题描述】:

在C编程语言中,是否可以不使用参数访问int argcchar **argv?我知道你们中的一些人可能会问为什么需要这样做,只是为了研究目的。

是否可以在不使用主参数变量的情况下生成 cmd 行参数?例如,为了说明一些我想到的伪代码,

LPTSTR cmd  = GetCommandLine();
splitted = cmd.split(" ") //split from spaces
char **someArgv.pushForEach Splitted, length++

你会有一个带有参数的someArgvlength 作为argc,这真的有助于了解是否可以说明。

【问题讨论】:

标签: c arguments command-line-arguments main


【解决方案1】:

如果 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);

【讨论】:

    【解决方案2】:
    #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;
    }
    

    【讨论】:

    • 唯一缺少的是不使用主要参数变量如OP所述
    • 在这种狭隘的情况下,main() 声明可能会与int main(); 一起使用。少出现一次argc, argv
    • 如果 main 被声明为 main() 那么这个实现将不会解析任何参数,那么为什么要首先传递它们呢?
    • 作为int main();声明 并不表示没有像int main(void); 这样的参数。没有参数的声明表示没有关于参数的信息。它将匹配后面的定义,例如 int main(void) {int main(int argc, char *argv[]) { ,...
    猜你喜欢
    • 2020-07-11
    • 2013-05-18
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多