c 命令行参数

c command line arguments

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

int convert(char *str)
{
  int i, number = 0;
  for (i = 0; str[i] != '[=10=]'; ++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 个参数时,它应该打印 "not enough arguments" 但它会给出错误分段错误。

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

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] != '[=11=]'; ++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;
}

P.S。由于 argv[0] 通常是程序名称而不是参数,因此 argv[1]argv[2] 将是您的参数, argv[3] 将是 NULL 如果您计算它们,您将计算两个参数,而不是三个;当给出三个参数时,期望 argc == 4

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