C++ 在现实生活中管理char*

C++ 在现实生活中管理char*,c++,C++,我有一个用参数char*描述符调用的函数。在函数中,我需要检查描述符不等于空字符串“”。如果是这样,请给出描述符名称“新名称”。但是名称不应该是常量,因为它将在函数encode中更改。这是我如何实现它的代码: f1(char* descriptor) { if (strcmp(descriptor, "") == 0) { char d[9] ="new_name"; descriptor = d; } ... encod

我有一个用参数
char*描述符调用的函数。在函数中,我需要检查描述符不等于空字符串
”。如果是这样,请给出
描述符
名称
“新名称”
。但是名称不应该是常量,因为它将在函数
encode
中更改。这是我如何实现它的代码:

f1(char* descriptor)
{
    if (strcmp(descriptor, "") == 0) 
        {
        char d[9] ="new_name";
        descriptor = d;
        }
...
encode(descriptor)
}

void encode(char* descriptor)
{
...
}
这个代码正确吗? 在我看来,代码看起来很笨拙。有没有可能以更优雅的方式编写这样的任务并使其更简单

f1(char* descriptor)
{
    if (strcmp(descriptor, "") == 0) 
    {
        strcpy(descriptor, "new_name");
    }
...
encode(descriptor)
}
考虑到我使用
std::string
,因为您用
c++
而不是
c
标记了帖子,在这种情况下,我看不出有任何理由使用
char*
而不是
std::string

编辑 我的代码仅在为空时对字符串进行编码。如果仍要更改字符串,则必须修改代码:

f1(std::string& descriptor)
{
    if (descriptor.empty()) 
    {
        descriptor = "new_name";
    }
    encode(descriptor);
}

void encode(std::string& descriptor)
{
    // Change string here.
}
考虑到我使用
std::string
,因为您用
c++
而不是
c
标记了帖子,在这种情况下,我看不出有任何理由使用
char*
而不是
std::string

编辑 我的代码仅在为空时对字符串进行编码。如果仍要更改字符串,则必须修改代码:

f1(std::string& descriptor)
{
    if (descriptor.empty()) 
    {
        descriptor = "new_name";
    }
    encode(descriptor);
}

void encode(std::string& descriptor)
{
    // Change string here.
}
如果你可以假设:

  • char*描述符
    指向足够长度的缓冲区:
  • 覆盖描述符的缓冲区是完全正确的
  • 然后您可以执行单行操作:

    encode(*descriptor:descriptor?strcpy(descriptor,"new_name"));
    
    如果
    *descriptor
    不为空,则三元运算符的计算结果为
    descriptor
    strcpy(descriptor,'new_name')
    ,否则,
    strcpy
    返回目标字符串,该字符串为
    descriptor
    ,新被“new_name”覆盖。如果可以假设:

  • char*描述符
    指向足够长度的缓冲区:
  • 覆盖描述符的缓冲区是完全正确的
  • 然后您可以执行单行操作:

    encode(*descriptor:descriptor?strcpy(descriptor,"new_name"));
    

    三元运算符计算为<代码>描述符< /代码>如果<代码>描述符< /C>不为null,并且结果<代码> STRCY(描述符,NexNeN名字)否则,和代码> STRCPY 返回目标字符串,即“代码>描述符< /代码>,新覆写为“NeXiNeNe”。< /P> < P>如果您使用C++,您应该使用

    std::string
    或某种变体。我假设您使用的是C,因为您的代码是纯C

    if (strcmp(descriptor, "") == 0) 
    {
        char d[9] ="new_name";
        descriptor = d;
    }
    
    这是错误的(而且,相信我,非常糟糕),因为
    d
    一旦超出范围,即
    if
    块结束时,它就会超出范围。所以,这里,你有一个未定义的行为。但是,如果您在函数的顶层定义了
    d
    ,那就可以了

    f1(char* descriptor)
    {
        char d[9] ="new_name";
        if (strcmp(descriptor, "") == 0) 
        {
            descriptor = d;
        }
        ...
        encode(descriptor)
    }
    

    现在你没问题,因为你不在引用“代码> D <代码>,因为它超出了范围:因为它的范围是整个函数(而不仅仅是<代码>如果/<代码>块),当你调用<代码> EnCORE(描述符)< /C>时,它仍然存在。

    < P>如果你使用C++,你应该使用<代码> STD::String < /C>或一些变体。我假设您使用的是C,因为您的代码是纯C

    if (strcmp(descriptor, "") == 0) 
    {
        char d[9] ="new_name";
        descriptor = d;
    }
    
    这是错误的(而且,相信我,非常糟糕),因为
    d
    一旦超出范围,即
    if
    块结束时,它就会超出范围。所以,这里,你有一个未定义的行为。但是,如果您在函数的顶层定义了
    d
    ,那就可以了

    f1(char* descriptor)
    {
        char d[9] ="new_name";
        if (strcmp(descriptor, "") == 0) 
        {
            descriptor = d;
        }
        ...
        encode(descriptor)
    }
    


    现在你没事了,因为一旦
    d
    超出范围,你就不再引用它了:因为它的范围是整个函数(而不仅仅是
    if
    块),当你调用
    encore(descriptor)
    时,它仍然存在。

    为什么不使用
    std::string
    ?第一条注释:
    chard[9]=“new\u name”;描述符=d根本不起作用,因为您正在将char*设置为一段立即超出范围的内存。这将导致未定义的行为。使用
    std::string
    ,考虑到您用
    c++
    而不是
    c
    标记文章?请发送您的确切代码,而不是伪代码,因为您确切地知道您的程序正在发生什么,而其他人不知道您的标题中的“真实生活”是什么意思?xD您的意思是在现实的生产环境中?这里的“现实生活”令人困惑:为什么不使用
    std::string
    ?第一条注释:
    chard[9]=“new_name”;描述符=d根本不起作用,因为您正在将char*设置为一段立即超出范围的内存。这将导致未定义的行为。使用
    std::string
    ,考虑到您用
    c++
    而不是
    c
    标记文章?请发送您的确切代码,而不是伪代码,因为您确切地知道您的程序正在发生什么,而其他人不知道您的标题中的“真实生活”是什么意思?xD您的意思是在现实的生产环境中?这里的“现实生活”令人困惑:PI只需做
    if(descriptor!=nullptr&&descriptor[0]='\0')
    ,而不是
    strcmp
    。如果
    descriptor
    指向的内存不足以存放
    新的\u名称怎么办?如果不够,分配代码就会在那里。但是没有,所以我想它已经有足够的空间了,我只需要做
    if(descriptor!=nullptr&&descriptor[0]='\0')
    ,而不是
    strcmp
    。如果
    descriptor
    指向的内存不足以容纳
    新的
    怎么办?如果不够,分配代码就会在那里。但是没有,所以我想它已经有足够的空间了,谢谢。我已经修好了,谢谢。我已经修复了它。但是如果描述符没有足够的空间用于“new_name”怎么办?那么你就不能这样做。但是如果描述符没有足够的空间用于“new_name”怎么办?那么你就不能这样做。@MatthewGunn不,因为一旦你离开函数,分配给
    descriptor
    d
    的事实就被丢弃了。我们在这里没有修改
    *描述符
    ,只修改
    描述符
    ,因此这是一种局部矫揉造作