0

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

#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 循环将重复 3 次,这没有意义,而且它给出的值完全错误。抱歉,我在这方面有点业余。提前致谢!

4

4 回答 4

2

您的代码有很多问题,其他人已经提到了一些问题,例如argv需要有一个char *[].

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

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

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

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

或者

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

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

于 2014-01-18T12:21:48.133 回答
1

首先, main 的签名应该是

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

然后你被传递字符串。您需要将它们转换为双打sscanf才能做到这一点 - 请参阅http://linux.die.net/man/3/sscanf

于 2014-01-18T12:20:31.333 回答
0

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

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

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

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

于 2014-01-18T12:21:10.393 回答
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] 不是输入。

于 2014-01-18T13:05:39.457 回答