C 从命令行参数动态分配的字符串
我希望在C中处理通过带有for循环的命令行参数传递的字符串。我想知道这是否是正确的方法C 从命令行参数动态分配的字符串,c,string,malloc,C,String,Malloc,我希望在C中处理通过带有for循环的命令行参数传递的字符串。我想知道这是否是正确的方法 main(int argc, char * argv[]) { char * somestring; somestring = malloc( (strlen(argv[1]) + 1) * sizeof(char) ); somestring = argv[1]; ... } 如果我这样做了,C是否会分配适当的内存: char * somestring; somes
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]
的意图不明确如果要在自己分配的内存中复制参数,则必须编写
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]
的意图并不清楚首先,这是一种将字符串复制到另一个字符串的错误方法。
您已经正确地分配了内存,但将字符串复制到另一个字符串的方法是错误的。您已经为字符串分配了内存,并将其地址收集到somestring中。现在将argv[1]赋值给它,这是命令行参数向量的地址,实际上是2D数组。所以您应该使用strcpy()来复制字符串
或者,如果只需要字符串的基址,请使用char指针,并为其分配argv[1]。但这是没有用的
另外,建议不要像现在这样传递命令行参数,因为所有参数都存储在参数向量argv中,该向量是2D数组。因此,如果只传递一个字符串,则可以,但如果传递多个字符串,则使用char**argv。首先,这是将字符串复制到另一个字符串的错误方法。 您已经正确地分配了内存,但将字符串复制到另一个字符串的方法是错误的。您已经为字符串分配了内存,并将其地址收集到somestring中。现在将argv[1]赋值给它,这是命令行参数向量的地址,实际上是2D数组。所以您应该使用strcpy()来复制字符串 或者,如果只需要字符串的基址,请使用char指针,并为其分配argv[1]。但这是没有用的
另外,建议不要像现在这样传递命令行参数,因为所有参数都存储在参数向量argv中,该向量是2D数组。因此,如果只传递一个字符串,则可以,但如果传递多个字符串,则使用char**argv。如果需要保留临时字符串,则需要分配内存,将其复制到新缓冲区(通过类似strcpy的函数)中,然后释放该缓冲区 但是在这种情况下,命令行参数不是暂时的。它们在整个流程生命周期内都可用。因此,只要记住指向它们的指针就足够了。这样就足够了:
const char* firstParameter = nullptr;
int main(int argc, char* argv[])
{
if (argc > 1) firstParameter = 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("%s\n",somestring);
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*somestring;
如果(argv[1]==NULL)
{
puts(“未指定参数1”);
出口(1);
}
somestring=malloc(strlen(argv[1])+1);
strcpy(somestring,argv[1]);
printf(“%s\n”,somestring);
返回0;
}
同样在为指针分配内存之前,首先检查
argv[1]
是否为NULL
一个好方法是为指针分配内存,并使用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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*somestring;
如果(argv[1]==NULL)
{
puts(“未指定参数1”);
出口(1);
}
somestring=malloc(strlen(argv[1])+1);
strcpy(somestring,argv[1]);
printf(“%s\n”,somestring);
返回0;
}
同样在为指针分配内存之前,首先检查
argv[1]
是否为NULL
为什么不使用strcpy
?如果你不要求,为什么C会为你分配内存呢?这取决于你。是否希望能够修改somestring
,并保持原始参数不变?是否只想使用(不修改)参数?我只想用for循环逐个字符地处理它。如果只想处理argv[1]元素,可以立即执行,无需先复制它。只有当您想更改它时,才建议创建一个副本(strcat,甚至更简单:strdup()-这会执行malloc和副本)malloc
在堆上创建空间来存储它strcpy
会将该字符串复制到您不使用strcpy的位置?如果你不要求,为什么C会为你分配内存呢?这取决于你。是否希望能够修改somestring
,并保持原始参数不变?是否只想使用(不修改)参数?我只想用for循环逐个字符地处理它。如果只想处理argv[1]元素,可以立即执行,无需先复制它。只有当您想更改它时,才建议创建一个副本(strcat,甚至更简单:strdup()-这会执行malloc和副本)m