我有一个用参数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)
{
...
}
这段代码是否正确? 对于我的观点,代码看起来很笨拙。是否有可能以更优雅的方式编写这样的任务并使其更简单?
答案 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)
如果你可以假设:
char* descriptor
指向足够长的缓冲区:然后你可以做单行:
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)
,它确实存在。