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
的事实就被丢弃了。我们在这里没有修改*描述符
,只修改描述符
,因此这是一种局部矫揉造作