c-从命令行参数中动态分配的字符串



我想用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。

相关内容

  • 没有找到相关文章

最新更新