C中的命令行参数问题

时间:2012-03-07 00:58:05

标签: c command-line-arguments

我假设我以错误的方式使用它,但我的想法是命令行参数是我的斐波纳西序列的长度...但是我这样做的方式,9我被搞砸了...我该如何解决这个问题?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int fibonacci(int n)
{
  int first = 0;
  int second = 1;
  int total, i;
  for (i=0;i<n;i++)
  {
    printf("%d\n", first);
    total = first + second;
    first = second;
    second = total;
  }
  return 0;
}
int main(int argc, char *argv[])
{
    /*Spawn a child to run the program.*/
    pid_t pid=fork();
    if (pid==0) { /* child process */
        if(*argv[1] == 45){
            printf("number invalid \n");
        }else{
            int number = *argv[1] - 48;
            fibonacci(number);
        }
    }
    else { /* pid!=0; parent process */
        waitpid(pid,0,0); /* wait for child to exit */
    }
    return 0;
}

5 个答案:

答案 0 :(得分:1)

您应该使用strtol或类似方法解析命令行参数,例如

number = strtol(argv[1],NULL,0);
/* last parameter gives the base, 0 detects hexadecimal (0x) and octal, defaults to 10 */

如果您想跳过错误检查。清理,错误检查:

char *end;
number = strtol(argv[1],end,0);
if (end == argv[1])
{
    /* no valid digits */
    exit(EXIT_FAILURE);
}
if (*end)
{
    /* not all of argv[1] has been consumed
     * handle errors
     */
}
/* full parse of argv[1], no problems, carry on */

答案 1 :(得分:1)

您的方式可以扩展到处理多个数字,但我认为您真正需要的是atoi()或未弃用的strtol()

答案 2 :(得分:0)

尝试使用函数atoi

答案 3 :(得分:0)

命令行参数是字符串;将字符串转换为整数:

int number = 9;
if (argc > 1)
    number = atoi(argv[1]);

这为您提供了一个默认值(9),以及覆盖它的选项。更彻底的检查将拒绝多于1个参数,并且atoi()

返回负或零
enum { MAX_FIBONACCI = 47 };

if (argc > 2)
{
    fprintf(stderr, "Usage: %s [number]\n", argv[0]);
    exit(EXIT_FAILURE);
}
if (argc == 2)
{
    number = atoi(argv[1]);
    if (number <= 0)
    {
        fprintf(stderr, "Invalid number %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    else if (number > MAX_FIBONACCI)
    {
        fprintf(stderr, "Number %s is too large (max is %d)\n", argv[1], MAX_FIBONACCI);
        exit(1);
    }
}

请注意,报告关键信息有助于识别出现了什么问题。在47个条目之后,溢出一个32位有符号整数。

请注意,如果您必须适应任何返回值,那么正确测试strtol()等错误是一项适度复杂的业务。如果您只需要容纳可以打印斐波那契数字的范围,那就更简单了。

重复的四行错误处理迅速变得令人厌烦。我使用这样的函数代替:

#include <stdarg.h>

void err_exit(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    exit(EXIT_FAILURE);
}

这会将错误报告减少到每个错误一行,这比四行更可取。 (我的完整系统比这更复杂,相当不同 - 除此之外,它会被告知程序名称并自动报告。但这是一个可行的起点。)

答案 4 :(得分:0)

得到这样的论点:

int num = atoi(argv[1]);