我想用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];
如果你想在自己分配的内存中复制一个参数,那么你必须编写
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]
的意图不明确
如果您需要保留一个临时字符串,那么是的,您需要分配内存,将其复制到新的缓冲区(通过类似strcpy
的函数),然后释放该缓冲区。
但在这种情况下,命令行参数不是瞬态的。它们可在整个过程中使用。因此,只要记住指向它们的指针就足够了。这样的东西就足够了:
const char* firstParameter = nullptr;
int main(int argc, char* argv[])
{
if (argc > 1) firstParameter = argv[1];
}
一个好的方法是为指针分配内存,并使用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("%sn",somestring);
return 0;
}
同样在为指针分配内存之前,首先检查argv[1]
是否不是NULL
。
Fisrt所有这些都是将一个字符串复制到另一个字符串的错误方法。您已经正确地完成了内存分配,但将一个字符串复制到另一个字符串的方法是错误的。您已经为字符串分配了内存,并将其地址收集到某个字符串中。现在您将argv[1]赋值给它,它是命令行参数向量的地址,实际上是2D数组。所以您应该使用strcpy()来复制字符串。
或者,如果您只想要字符串的基地址,请使用char指针,并将argv[1]分配给它。但这没有用。
p.S.不建议像您这样传递命令行参数,因为所有参数都存储在参数向量argv中,argv是2D数组。因此,如果您只传递一个字符串,那么这是可以的,但如果您传递多个字符串,则使用char**argv。