我对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;
}
我很抱歉,如果这让我有点困惑(或天真);但我对这种语言非常陌生,所以我仍然试图弄清楚所有事情。
非常感谢您的任何帮助:)
尝试这样的事情:
#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;
}
然后根据您的需要进行调整。您不需要为第一个输入参数指定人数,因为它是由您为每个人指定的汽车数量所暗示的。
代码
#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 carsn", 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 *
person[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()
分配的内存;它为指针(最初是一个char *
)分配了一个int
。
if (i == 1)
numberOfCars--;
这涉及"从第一个参数中减去一个"的要求。
person[i] = numberOfCars;
这记录了该人i
拥有的汽车数量。 它没有被使用;它可以代替printf()
声明中的numberOfCars
。
printf("Person %d has %d carsn", i, numberOfCars);
行尾的空格是我的黑夜。 不要在换行符前放置空格。
}
free(person);
释放已分配的内存。 在这个玩具程序中,它并不重要(o/s 即将释放程序使用的所有资源),但如果它是一个大程序中的函数并且省略了free()
,那么每次调用它时都会泄漏内存。 养成在写完malloc()
后立即为每个malloc()
编写free()
的习惯。 (或者,至少,确保你知道在哪里编写free()
,并在编译程序之前编写free()
,更不用说测试程序了。
return 0;
}
你想动态存储什么?如果只想打印您提到的值。您根本不需要动态分配。
如果您想存储它们,请使用夏亚**人;而不是 *person 并使用
person[i] = malloc(sizeof(argv[i])+sizeof("person have cars"));//不确定您需要存储的格式,您可以相应地更改它
atoi
返回一个 int,但person
是一个字符指针。
#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