我希望处理一个通过命令行参数传递的字符串,并在C中使用for循环。我想知道这是否正确。
main(int argc, char * argv[])
{
char * somestring;
somestring = malloc( (strlen(argv[1]) + 1) * sizeof(char) );
somestring = argv[1];
...
}
或者如果我这样做,C会分配适当的内存:
char * somestring;
somestring = argv[1];
答案 0 :(得分:3)
如果要在自己分配的内存中复制参数,则必须编写
int main(int argc, char * argv[1])
{
char * somestring;
somestring = malloc( strlen( argv[1] ) + 1 );
strcpy( somestring, argv[1] );
...
}
否则声明
somestring = argv[1];
会导致内存泄漏。
也不要忘记在不再需要时释放内存。
考虑到这个记录
int main(int argc, char * argv[1])
有效,最好写
int main(int argc, char * argv[])
因为您指定char * argv[1]
的意图不明确
答案 1 :(得分:1)
如果你需要保留一个瞬态字符串,那么你需要分配内存,将其复制到新缓冲区(通过strcpy
- 类似函数),然后释放该缓冲区。
但在这种情况下,命令行参数不是瞬态的。它们可在整个生命周期内使用。因此,仅记住指向它们的指针就足够了。所以这样的事情就足够了:
const char* firstParameter = nullptr;
int main(int argc, char* argv[])
{
if (argc > 1) firstParameter = argv[1];
}
答案 2 :(得分:0)
所有这些都是将字符串复制到另一个字符串的错误方法。 您已经正确地完成了内存分配,但是将字符串复制到另一个字符串的方法是错误的。您已为字符串分配内存并将其地址收集到somestring中。现在你要为它分配argv [1],它实际上是命令行参数向量的地址,它是2D数组。所以你应该使用strcpy()来复制字符串。
或者如果你只想要字符串的基地址使用char指针而是为它分配argv [1]。但这没用。
P.S。不建议传递命令行参数,因为所有参数都存储在参数向量argv中,即二维数组。因此,如果您只传递一个字符串,那么它没关系,但是如果您传递的是多个字符串,那么请使用char ** argv。
答案 3 :(得分:0)
一种好方法是为指针分配内存并使用strcpy
函数来复制内容。
例如:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
char *somestring;
if(argv[1] == NULL)
{
puts("Argument 1 is not specified.");
exit(1);
}
somestring = malloc( strlen(argv[1])+1 );
strcpy(somestring, argv[1]);
printf("%s\n",somestring);
return 0;
}
在为指针分配内存之前,首先检查argv[1]
是否不是NULL
。