如何修复命令行参数的输出以打印出正确的整数?

时间:2016-10-08 23:33:01

标签: c atoi

#define N 10

int main(int argc, char *argv[])
{
    int *a = malloc(sizeof(N));
    int i;

    for(i = 1; i < argc; i++) {
        *(a++) = atoi(argv[i]);
    }

    i = 0;
    while(i < N) {
        printf("%d ", *(a++));
        i++;
    }
}

我很困惑为什么我的输出全是0。我不确定如何修复它,因为我是命令行参数/指针的新手。这个程序的背景是它接受整数,然后应该使用atoi将它们从字符串转换为整数,然后使用指针算法将新数组打印出来。

2 个答案:

答案 0 :(得分:1)

这有很多错误。

sizeof(N)给出整数常量的大小(可能是4个字节)。你的意思是malloc(N * sizeof(int));但是如果N是商城而且你在编译时就知道它,那么使用malloc并没什么意义。你想要malloc argc整数。然后程序将扩展到数百万个命令行参数,假设shell允许输入这么长的行。

然后当你指向一个指针时,你需要挂在它上面。不要增加它。如果你想要一个旅行指针,使用两个指针,a和ptr。指向缓冲区并“拥有”它,ptr是一个临时移动。但是,数组语法a [i]几乎总是优于行进指针。

然后,如果argc小于N,那么最后一次将打印垃圾值。这可能是你想要的学习练习/探索性编程,但不是你通常希望实现的目标。

答案 1 :(得分:1)

反对我更好的判断,这是你的家庭作业的解决方案。请注意以下事项:

  • 它没有转换malloc的返回值
  • 测试malloc的返回值是非NULL
  • 释放它分配的内存
  • 它使用各种指针算法
  • 正在纠正使用argv [0]
  • 纠正滥用argc
  • 使用&#34; yoda条件&#34;消除编译器愚蠢的可能性
  • 如果您提供的不仅仅是N参数
  • ,它仍然会出现段错误
#define N 10
int main(int argc, char *argv[])
{
    int *numbers;

    if (NULL != (numbers = malloc(N * sizeof *numbers))) {
        for(int i = 0; i < (argc - 1); i++) {
            *(numbers + i) = atoi(argv[i + 1]);
        }

        for(int* a = numbers; a < (numbers + (argc - 1)); a++) {
            printf("%d ", *(a));
        }
        free(numbers);
    }
}