将未指定数量的命令行输入放入C中的数组中

时间:2014-01-18 12:17:32

标签: c malloc argc

我基本上想要从用户输入的命令行中读取值并将它们放入数组中。到目前为止,我对此的尝试如下

#include    <stdlib.h>
#include    <stdio.h>
#include    <math.h>

#define     w   1.0


int main(int argc, char argv[])
{
    int     tmp;

    double  *x, *v, *m, *k, *R;

    x = malloc((argc-1)*sizeof(double));

    printf("%lf\n", argc);

    for(tmp=0; tmp<argc-1; tmp++)
    {
        x[tmp] = argv[tmp+1];
        printf("%lf\n", x[tmp]);
    }
}

argc值的打印等于0,而for循环将重复三次,这是没有意义的,它给出的值完全错误。对不起,我有点像业余爱好者。提前谢谢!

4 个答案:

答案 0 :(得分:2)

您的代码存在许多问题,有些问题已经被argv等其他人提及,需要char *[]类型。

首先,如果argc为1,那么malloc将失败,因为分配大小为0的内存没有意义。

其次,printf("%lf\n", argc);不正确。 argcint,您需要使用%d进行打印。你看到0的原因是错误的,就是这个。

第三,x[tmp] = argv[tmp+1];也不正确。 argv[tmp+1]char *,这意味着它是一个字符串。虽然x[tmp]double。您不能只将字符串分配给double。您需要做的是将字符串转换为double,例如:

sscanf(argv[tmp+1], "%lf", &x[tmp]);

x[tmp] = strtod(argv[tmp+1]);

提示:始终使用常见警告编译代码。使用gcc,这将是-Wall命令行参数。编译器可以告诉你许多这些错误。

答案 1 :(得分:1)

首先,main的签名应为

int main(int argc, char *argv[])

然后你传递字符串。您需要将它们转换为双打sscanf才能执行此操作 - 请参阅http://linux.die.net/man/3/sscanf

答案 2 :(得分:0)

printf("%lf\n", argc)会导致内存访问冲突,因为:

  1. argc是一个整数类型(4个字节)。

  2. printf("%lf...尝试读取8个字节。

  3. 您必须将其更改为printf("%d\n", argc)

答案 3 :(得分:0)

int main(int argc, char* argv[])
{
int i;

//calloc = malloc for N elemnts of given size
double* myArray = (double*)calloc(argc, sizeof(double));

//Check out arg 0!
for (i = 0; i<argc; i++)
{
    printf("arg [%d] = %s\n",i,argv[i]);
}
for (i = 1; i<argc; i++)
{
    sscanf(argv[i], "%lf", &myArray[i]);
    printf("myArray[%d] = %f\n",i, myArray[i]);
}
//avoid memory leak
free(myArray);
}

我看到我的回答有点迟了,反正我只想指出arg [0]没有输入。