【问题标题】:c command line argumentsc 命令行参数
【发布时间】:2017-06-26 19:08:31
【问题描述】:
#include <stdio.h>
#include <string.h>

int convert(char *str)
{
  int i, number = 0;
  for (i = 0; str[i] != '\0'; ++i) {
    number = number * 10 + str[i] - '0';

  }
  return number;
}

int main(int argc, char *argv[])
{
  int j;
  int c = convert(argv[2]);
  if (argc == 3) {
    for (j = 0; j < c; j++) {
      printf("Hello, %s!\n", argv[1]);
    }
  } else if (argc < 3) {
    printf("Not Enough Arguments\n");
  } else if (argc > 3) {
    printf("Too Many Arguments\n");
  }
  return 0;
}

给出少于 3 个参数时出现分段错误。 在给出少于 3 个参数时,它应该打印“没有足够的参数”,但它会给出错误分段错误。

输入:./a raju 预期输出:not enough arguments

【问题讨论】:

  • 在检查之前使用argv[2] 是个坏主意,我猜......真的,你不能校对自己的代码(不是说疯狂的格式)吗?

标签: c command-line command


【解决方案1】:
int c = convert(argv[2]);

argc 为2 时,argv[2] 将为NULL。您希望这行代码会做什么,因为它是在程序运行时首先执行的?

重构,以便它下面的条件形成对这种条件的防范,这里有一些更接近你可能想要的东西:

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int convert(char *str)
{
  int i, number = 0;
  for (i = 0; str[i] != '\0'; ++i) {
    number = number * 10 + str[i] - '0';
  }
  return number;
}

int main(int argc, char *argv[])
{
  if (argc != 3) {
    printf(  argc < 3   ? "Not Enough Arguments\n"
           /*argc > 3*/ : "Too Many Arguments\n"  );
    exit(EXIT_FAILURE);
  }

  int c = convert(argv[2]);
  for (int j = 0; j < c; j++) {
    printf("Hello, %s!\n", argv[1]);
  }
  return 0;
}

附:因为argv[0] 通常是程序名称而不是参数,所以argv[1]argv[2] 将是您的参数,argv[3] 将是NULL,如果您计算它们,您将计算两个参数,而不是三个;当给出三个参数时,期望argc == 4

【讨论】:

    【解决方案2】:

    您可能对getopt.h library 感兴趣。它处理命令行参数的所有标准功能。

    【讨论】: