【问题标题】:C - is char* template a special type of string?C - char* 模板是一种特殊类型的字符串吗?
【发布时间】:2016-07-24 02:16:06
【问题描述】:

我遇到了这样的一行

char* template = "<html><head><title>%i %s</title></head><body><h1>%i %s</h1>        </body></html>";

在阅读代码以实现 Web 服务器时。

我很好奇,因为我以前从未见过这样的字符串 - 模板是否指定了一种特殊类型的字符串(我只是在这里猜测,因为它在我的 IDE 上突出显示)?另外,strlen() 如何处理这样的事情?

谢谢

【问题讨论】:

  • 这似乎是正常的字符串。将字符串解释为模板将是代码其他部分的任务,strlen() 将正常工作。
  • 那么 %i 和 %s 用 strlen() 算作 2 个字符吗?
  • template 只不过是变量的名称。 (它是 C++ 中的关键字,而不是 C 中的关键字。)
  • strlen() 将按原样给出字符串的长度,而不特别处理%。如果它们是 printf() 或类似的格式说明符,那么从它生成的格式化输出可能会更长(但该输出不会是相同的字符串)。

标签: c string


【解决方案1】:
char* template = "<html>...</html>";

基本上和

没有什么不同
char *s = "hello";

template这个名字并不特殊,它只是一个普通的标识符,变量的名字。 (template 恰好是 C++ 中的关键字,但这是 C。)

最好将其定义为const,以强制执行字符串文字不能修改的事实,但这不是强制性的。

请注意,template 本身不是字符串。它是一个指向字符串的指针。字符串本身(由语言定义为“一个连续的字符序列,以第一个 null 结尾并包括 character") 是以"&lt;html&gt;" 开头并以"&lt;/html&gt;" 结尾的序列和隐式终止空字符。

在回答您的第二个问题时,strlen(template) 可以正常工作,为您提供字符串的长度(在本例中为 81)。

【讨论】:

    【解决方案2】:

    我想代码的另一部分使用此字符串来格式化输出字符串,该字符串用作 Web 服务器的页面。 strlen 函数将返回字符串的长度。

    【讨论】:

      【解决方案3】:

      除非在初始化程序的某处有一个空字符或使用\ 字符的转义序列,否则这个字符串没有什么特别之处。 % 是字符串中的普通字符,不接受特殊处理。特别是 strlen 函数会将 %i 读取为两个字符,即 %i%s 也是如此。

      相比之下,\ 是字符串的特殊字符,表示转义序列。 \ 和字符串常量中跟在它后面的字符构成字符串本身中的单个字符。例如,\n 表示换行符 (ASCII 10),\t 表示制表符 (ASCII 8)。

      此字符串最有可能用作printf 的格式字符串。此函数将读取字符串并将%i%s 解释为格式字符串,分别接受intchar *

      【讨论】:

        【解决方案4】:
        char* template = "<html>...</html>";
        

        只需创建一个char数组来存储数据"&lt;html&gt;...&lt;/html&gt;",这个数组名是template,你可以把这个名字改成你想要的其他名字。创建char数组时,编译器会在末尾添加\0 array.strlen 将计算从数组开始到\0 的长度(\0 不包含)。


        我认为你的 IDE 会突出显示这个字符串是因为这个字符串被用在了其他地方。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-26
          • 2021-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多