可选命令行参数的默认值

Posted

技术标签:

【中文标题】可选命令行参数的默认值【英文标题】:Default values for optional command line arguments 【发布时间】:2022-01-16 10:33:31 【问题描述】:

我有一个套接字编程任务来构建客户端/服务器聊天。当我在终端中键入 3 值时,我的代码有效,但问题是我想不出一种方法将它们全部作为可选参数并在下面的任何示例中设置一些默认值,

    ./Client ./Client username ./Client username portNumber ./Client username portNumber serverAddress
int
main (int argc, char *argv[])

    connection_info connection;
    fd_set file_descriptors;

    if (argc =! 4)
      
          fprintf (stderr, "Usage: %s <IP> <port> <Name>\n", argv[0]);
          exit (1);
      


         connect_to_server(&connection, argv[1], argv[2], argv[3]);

关于默认值,我只需要用户名是“Anynamous”,ip是“localhost”,而端口是3000

【问题讨论】:

(argc == 3 )时,你想怎么打电话给connect_to_server()?您希望 serverAddress 的默认值是多少? char username[100] = "fooy"; if(argc &gt;= 2) strncpy(username, argv[1], 99); 我更改了您问题的标签:仅仅因为您的程序恰好使用线程并不意味着使用“多线程”标签是合适的。仅当您对多线程不了解时,才应使用该标签。 “unix”标签和“chat”标签也是如此。您的问题是关于 C 程序如何理解其命令行参数。 非常感谢@SolomonSlow 对这个问题的反馈。这是第一次来,下次会更好。 非常感谢您的回复@chux-ReinstateMonica,关于默认值,我希望用户名是“Anynamous”,ip 是“localhost”,而端口是 3000。 【参考方案1】:

我希望用户名是“Anynamous”,ip 是“localhost”,而端口是 3000

为这些默认值设置并在传递了足够多的参数时更改它们。

int main (int argc, char *argv[]) 
  const char *username = "Anynamous"; // Or maybe "Anonymous" 
  const char *ip = "localhost";
  int port = 3000;

  if (argc >= 2) username = argv[1];
  if (argc >= 3) ip = argv[2];
  if (argc >= 4) port = atoi(argv[3]);  // Could add some conversion checking here.

  connection_info connection;
  connect_to_server(&connection, username, ip, port);
  fd_set file_descriptors;
  // ...

【讨论】:

谢谢,但是当我使用你的代码时,它显示的不是“分段错误(核心转储)”,所以直到现在才知道问题出在哪里。但是当我将数据直接插入命令行时,它可以正常工作。 @unknown 最好发minimal reproducible example。 查看上面的完整源代码,我只是添加我已经使用过的完整代码。 @chux - 恢复莫妮卡 @chux-reinstate-monica @unknown 不是最小的。嗯 connect_to_server (connection_info * connection, char *address, char *port, char *name) 需要 3 个 char *,为此调整代码。

以上是关于可选命令行参数的默认值的主要内容,如果未能解决你的问题,请参考以下文章

一种命令行解析的新思路(Go 语言描述)

未提供值时命令行参数的默认值[重复]

使用子解析器时,命令行参数被默认值覆盖

SpringBoot修改JVM参数(内置Tomcat命令行启动和IDEA工具配置修改)

java基础3-重载+命令行传参+递归+数组+排序

SAR命令