在现实生活中管理char *

时间:2015-12-03 09:46:57

标签: c++

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

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

void encode(char* descriptor)
{
...
}

这段代码是否正确? 对于我的观点,代码看起来很笨拙。是否有可能以更优雅的方式编写这样的任务并使其更简单?

4 个答案:

答案 0 :(得分:3)

f1(std::string& descriptor)
{
    if (descriptor.empty()) 
    {
        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. }

修改

我的代码仅在空时编码字符串。如果你想要改变字符串,你必须修改代码:

#include <sys/file.h>
#define   LOCK_SH   1    /* shared lock */
#define   LOCK_EX   2    /* exclusive lock */
#define   LOCK_NB   4    /* don't block when locking */
#define   LOCK_UN   8    /* unlock */

int flock(int fd, int operation);

答案 1 :(得分:0)

f1(char* descriptor)
{
    if (strcmp(descriptor, "") == 0) 
    {
        strcpy(descriptor, "new_name");
    }
...
encode(descriptor)
}

答案 2 :(得分:0)

如果你可以假设:

  1. char* descriptor指向足够长的缓冲区:
  2. 覆盖描述符的缓冲区完全没问题。
  3. 然后你可以做单行:

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

    如果descriptor不为空,则三元运算符求值为*descriptor,否则求strcpy(descriptor,'new_name')的结果,strcpy返回目标字符串{{1}用&#34; new_name&#34;。

    新覆盖

答案 3 :(得分:0)

如果您使用的是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:因为它的范围是整个函数(而不仅仅是if块),当你打电话时encore(descriptor),它确实存在。