【问题标题】:Can I read command line argument as binary?我可以将命令行参数读取为二进制吗?
【发布时间】:2018-03-22 16:21:15
【问题描述】:

是否可以将命令行参数读取为二进制数?如果是,如何?

例如, ./a -v 10010110

此选项允许用户从 12 个寄存器中选择要使用的寄存器。我希望用户传递一个 16 位二进制数,需要使用标志 1 读取寄存器,否则使用平面 0

这是我的想法。如果这不是一个好主意,我怎样才能在不混淆用户的情况下完成它?

【问题讨论】:

  • 命令行参数作为字符串传递给您的程序。您需要在程序的参数解析部分将字符串“10010110”转换为二进制表示。这是一个好主意,你可以传递任何你想要的命令行参数。只需在帮助菜单/文档中明确说明您的程序需要什么样的输入以及它们的格式应该是什么。
  • 另一种方法是用户传递一个数字列表,例如2 3 5 8,而不是尝试设置正确的位。我更希望写12 而不是100000000000。 :-)

标签: c command-line flags


【解决方案1】:

命令行上传递的值是字符串。在程序内部,您可以选择任何方式处理字符串。

如果您需要从 0..15(或 1..16)集合中获取单个位,最好采用该位的十进制数,而不是强制用户进行计数。您只需获取argv[2] 或包含该数字的任何索引,使用atoi()strtol() 等函数将其转换为数字bitnum(错误检查负值或大值的值),然后使用@987654326 @ 以获取 16 位 unsigned short 或等效值的值。

如果用户可以在一个命令调用中指定多个寄存器,那么二进制更合理(尽管不一定完全合理),但请考虑十六进制优于二进制的优点(一个十六进制数字控制四位的值)。

如果你坚持使用二进制,那么strtol()就是要使用的函数;它将字符串转换为二进制(char *eos; int bitnum = strtol(argv[2], &eos, 2); - 然后是check the conversion carefully;您需要在转换之前将errno 设置为0,并仔细查看返回值以及eos 指向的位置)。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2014-08-09
    • 2014-09-22
    • 2023-03-28
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多