当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以在C中传递字符串文字作为引用

范瀚昂
2023-03-14

在C中,如果值不能为NULL,则通常引用传递而不是指针。

假设我有一个具有以下签名的函数,该签名通常与字符串文字一起使用。

void setText( const char* text );

我想知道如何更改函数,使其接受引用(并且具有不接受NULL的优势)?

>

另一个选项是(constd::字符串

任何其他常用方法,或者只需坚持使用std::string即可


共有2个答案

笪烨
2023-03-14

这里有一个小问题,C和数组的引用不是最好的一对。有关参考信息,请参见:C通过引用传递数组

由于您正在讨论将引用绑定到字符串,而字符串是一个字符数组,我们将直接遇到这个问题。有鉴于此,我们真正能做的最好的事情就是将ref绑定到const char*,它看起来像这样:

void ref(const char* const& s);

但这并不是您想要的;这将绑定对指针的引用,并且它只保证指针本身存在,而不是指向有效的字符串文本。同样的问题也存在于d::字符串中

最后,我会支持赞说的话。const char*是一个广受尊重的习惯用法,它传递字符串文本,然后使用绑定到字符串的第二个重载是一个很好的便利。

(最后一点注意:std::string并不“总是”分配内存。使用小字符串优化的实现将跳过长达23个字符的字符串。)

钱嘉致
2023-03-14

老实说,我只需要保留constchar*text函数并添加一个重载conststd::string

 类似资料:
  • 问题内容: 让我们说我有这样的查询: 通过在各处手动更改字符串,我使用不同的表多次运行此查询。我尝试声明以下内容: 但这似乎不起作用,因为它引发了一个错误,提示我必须先声明为表变量,然后才能使用它。我如何对表名进行模板化,如果可以的话,Intellisense仍然可以使用吗? 问题答案: 您可以将其包装在EXEC语句中,如下所示: 但是不,在这种情况下,智能感知将无法正常工作。 如果您事先知道输出

  • 是的,我可以解析字符串并使用来设置每个值,但由于性能原因,我正在寻找一种方法来避免不必要的双重转换(可能会从服务器接收大量数据,每个标记有许多属性,因此通过一次传递为一个标记设置所有属性可以在前端得到轻松的改进)。不管怎么说,如果我已经有了一部分可以使用的经过处理的HTML代码--为什么不直接使用它呢。 UPD:这不是关于如何在一次调用中设置多个属性的重复问题,因为我正在寻找一种方法来避免解析属性

  • 问题内容: 给定一个结构: 以及带有结构名称的字符串 要么 如何从字符串名称而不是结构创建结构的实例?我的想法是,我将使用链接到二进制文件中的所有结构创建一个应用程序,但根据字符串创建运行时实例。(某种元元) 问题答案: Go中没有类型的中央注册表,因此在一般情况下您无法提出要求。 您可以使用从字符串到对应于每种类型的值的映射来手动建立自己的注册表来支持这种功能。例如: 然后,您可以创建如下类型的

  • 我有以下2种方法: 两种方法的内容相等,我尝试使用以下方法: 但当我尝试将其与字符串或Long iterable一起使用时,它会引发编译错误。有什么解决方案吗?

  • 我试图通过C#代码传递此字符串,但失败了: soap:body1479374 System.xml.XmlDocument文档=新建System.xml.XmlDocument();Doc.LoadXML(字符串); 尝试发送作为整体和作为3个部分,但在A节内失败 string Sectiona=@“ soap:body ”; 字符串段B=“1479374”; 字符串节C=“”; 字符串数据=段A

  • 问题内容: 除了使用方法和逐个替换字母以外,还有没有更好的方法来消除重音并使这些字母规则化?例: 输入: 输出: 它不需要包括所有带有重音符号的字母,例如俄语字母或中文字母。 问题答案: 使用java.text.Normalizer来处理这个给你。 这会将所有重音符号与字符分开。然后,您只需要比较每个字符和一个字母,然后扔掉那些不是字母。 如果您的文本使用unicode,则应改用以下代码: 对于,