【问题标题】:How to read program arguments [closed]如何读取程序参数
【发布时间】:2013-03-08 22:16:54
【问题描述】:

我想读取客户端请求的线程数。所以如果有人像这样运行我的程序:

./test 2

我必须读取等于 2 的线程数。我尝试 getchar() 但它不起作用。有什么想法吗?

【问题讨论】:

  • 在这种情况下,2 作为参数传递给程序。尝试搜索有关在 C 程序中处理参数的信息。
  • 我有个主意——至少读一些关于 C 编程的书...
  • 我尝试了 argv[0],但它无法读取“2”
  • argv[0] 始终包含命令调用的程序名称。因此,第一个 real 参数存储在argv[1] 中。但是您必须检查是否存在这样的论点。为此,只需阅读argc,它会告诉您argv 指向的元素数量。在你的情况下,它应该等于 2。

标签: c


【解决方案1】:

这是一个包含完整、正确的错误检查和诊断消息的最小示例。请注意,将 errno 设置为 0 是区分范围错误和有效 strtoul() 输出所必需的,这是该函数的一个烦人的怪癖。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[])
{
    if (argc != 2) {
        fputs("usage: test NTHREAD\n", stderr);
        exit(1);
    }
    char *e;
    errno = 0;
    unsigned long nthread = strtoul(argv[1], &e, 0);
    if (!*argv[1] || *e) {
        fputs("error: invalid NTHREAD\n", stderr);
        exit(1);
    }
    if (nthread == (unsigned long) -1 && errno == ERANGE) {
        fputs("error: NTHREAD out of range\n", stderr);
        exit(1);
    }
    // Your code goes here
}

【讨论】:

  • errno 一开始不会是零吗?
  • @paxdiablo:我输入errno = 0 是为了允许将代码块复制并粘贴到不保证前提条件errno == 0 的部分中。这也意味着阅读代码的人不必检查周围的代码来验证前提条件。
  • 公平点,有道理。
  • 也许我误解了,但我认为这不是有效的 C(尽管对于 C++ 示例可能没问题),因为 C 要求所有变量声明都发生在任何代码之前(所以 @ 的声明987654326@ 和 nthread 会导致错误)...
  • @neilr8133:您指的是 C 标准的过时版本。自 1999 年以来,C 标准就允许这样的声明,并且对该功能的广泛编译器支持比这更早。
【解决方案2】:

这与线程本身无关。

如果给定程序的第一个参数,将在argv[1] 中找到,但它是一个字符串,因此您需要将其转换为整数,例如atoistrtol

【讨论】:

    【解决方案3】:

    int main(int argc, int **argv)

    使用main的参数,你应该知道第一个参数argv[0]是当前执行文件的名称,后面的参数是发送给你的程序的参数。

    在你的情况下,你必须阅读argv[1]

    始终检查 argc 以计算输入的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多