0

我对 C 语言相当陌生,并且对指针和动态内存分配感到有些困惑。我要做的是读取命令行参数并将它们存储在动态内存分配中;然后打印出来。例如,如果我输入 ./rpd 4 3 2 3 8 那么 argv[1] (4) 应该减少,其他 3 个值 (3, 2, 3, 8) 应该跟随。输出应如下所示:

人 1 有 3 辆车。人 2 有 2 辆车。人 3 有 3 辆车。第 4 个人有 8 辆车。

我的代码是:

  #include <stdio.h>

int main(int argc, char *argv[]) {
    /** argc is number of arguments at command line*/
    /** argv[] is an array of pointers to character strings
        i.e. argv 1 points to argc 1 */
    int numberOfCars;
    char *person;
    int i;
    int j;

    // Allocate the size of the array for each element of char
    person = malloc(sizeof(numberOfCars) *argc);

    for(i = 2; i < argc; i++) {
        /** Convert char to int */
        numberOfCars = atoi(argv[i]);
        person = atoi(argv[1]);
        if(person > 0){
            for(j = 2; j < person; j--) {
                printf("Person %d has %d cars \n", person--, numberOfCars);
            }
        } else {
            /** DO NOTHING */
        }
    }
    return person;
}

如果这让我有点困惑(或幼稚),我很抱歉;但我对这门语言非常陌生,所以我仍在努力理解一切。

非常感谢您的帮助:)

4

4 回答 4

1

尝试这样的事情:

#include <stdio.h>

int main(int argc, char *argv[]) {
    /** argc is number of arguments at command line*/
    /** argv[] is an array of pointers to character strings
        i.e. argv 1 points to argc 1 */
    int numberOfCars;
    int i;

    for(i = 1; i < argc; i++) {
        /** Convert char to int */
        numberOfCars = atoi(argv[i]);
        printf("Person %d has %d cars \n", i, numberOfCars);
    }

    return 0;
}

然后根据您的需要进行调整。您不需要为第一个输入参数指定人数,因为它是由您为每个人指定的汽车数量所暗示的。

于 2013-11-10T17:46:03.390 回答
0

atoi返回一个 int,但person它是一个 char 指针。

#include <stdio.h>
int main(int argc, char *argv[]) {
   /** argc is number of arguments at command line*/
   /** argv[] is an array of pointers to character strings
    i.e. argv 1 points to argc 1 */
   int numberOfCars;
   int i;
   int p = 0;
   for(i = 2; i < argc; i++) {
      /** Convert char to int */
      numberOfCars = atoi(argv[i]);
      printf("Person %d has %d cars \n", ++p, numberOfCars);
   }
   return 0;
}

输出:

$ ./a.out 4 3 2 3 8 10
 Person 1 has 3 cars 
 Person 2 has 2 cars   
 Person 3 has 3 cars 
 Person 4 has 8 cars 
 Person 5 has 10 cars
于 2013-11-10T17:39:17.817 回答
0

代码

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

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

    person = malloc(sizeof(int) * argc);

    for(i = 1; i < argc; i++)
    {
        numberOfCars = atoi(argv[i]);
        if (i == 1)
            numberOfCars--;
        person[i] = numberOfCars;
        printf("Person %d has %d cars\n", i, numberOfCars);
    }

    free(person);
    return 0;
}

样本输出

$ ./rpd 4 3 2 3 8
Person 1 has 3 cars 
Person 2 has 3 cars 
Person 3 has 2 cars 
Person 4 has 3 cars 
Person 5 has 8 cars
$

解释

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

您需要<stdlib.h>声明malloc()free()。当你使用时malloc(),你也应该使用free()

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

该变量j在修订版中未使用,因此被删除。变量person更改为int *asperson[i]将存储人i拥有的汽车数量。

    person = malloc(sizeof(int) * argc);

我把它改成sizeof()int; 它也可以使用sizeof(*person),并且有充分的理由更喜欢它。

    for (i = 1; i < argc; i++)
    {
        numberOfCars = atoi(argv[i]);

分配person = atoi(argv[1]);在多个级别上都是错误的。malloc()它泄露了由;分配的内存。它将 a 分配int给一个指针(最初是 a char *)。

        if (i == 1)
            numberOfCars--;

这涉及“从第一个参数中减去一个”要求。

        person[i] = numberOfCars;

这记录了该人i拥有的汽车数量。它没有被使用;它可以用来代替numberOfCars语句printf()

        printf("Person %d has %d cars\n", i, numberOfCars);

行尾的空格是我的最爱。不要在换行符之前放置空格。

    }

    free(person);

释放分配的内存。在这个玩具程序中,它并不关键(o/s即将释放程序使用的所有资源),但如果它是一个大程序中的函数并且它省略了free(),它每次都会泄漏内存叫做。养成在写完free(). (或者,至少,确保您知道将在哪里编写,并编译之前编写程序,更不用说测试了。)malloc()malloc()free()free()

    return 0;
}
于 2013-11-10T17:54:08.937 回答
0

你想动态存储什么?如果只想打印您提到的值。您根本不需要动态分配。

如果您想存储它们,请使用 char **person; //而不是 *person 并通过使用为每个人分配内存

person[i] = malloc(sizeof(argv[i])+sizeof("人有车")); //不确定您需要存储的格式,您可以相应地更改它

于 2013-11-10T17:58:06.350 回答