Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从命令行参数动态分配的字符串_C_String_Malloc - Fatal编程技术网

C 从命令行参数动态分配的字符串

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

我希望在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]
的意图不明确

如果要在自己分配的内存中复制参数,则必须编写

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