如何打印嵌入空值的字符串,以便用“(null)”替换“\0”

2023-12-02

我有一个使用 memcpy() 组成的字符串(展开时)如下所示:

char* str = "AAAA\x00\x00\x00...\x11\x11\x11\x11\x00\x00...";

我想打印字符串中的每个字符,如果该字符为空,则打印出来"(null)"作为 '\0' 的替代品。

如果我使用像 put() 或 printf() 这样的函数,它只会在第一个 null 处结束并打印出来

AAAA

那么我怎样才能让它打印出实际的单词“(null)”而不将其解释为字符串的结尾呢?


您必须自己进行映射。如果你愿意的话,那就是。在 C 中,字符串以 null 结尾。因此,如果您使用格式化输出函数,例如printf or puts并要求它打印一个字符串(通过格式说明符%s)它会停止打印str一旦它达到第一个空值。没有nullC 中的单词。如果您确切知道 C 中有多少个字符str您也可以循环遍历它们并单独打印出字符,并将0通过您选择的助记符。

草案7.21.6.1/8说:

p参数应该是一个指向 void 的指针。指针的值为 转换为打印字符序列,在 实现定义的方式。

然而,以下情况:

$ cat null.c
#include <stdio.h>
int main() {
 printf("%p\n", (void *)0);
}

产生:

00000000

在 gcc 4.6 和 clang 3.2 上。

然而,深入挖掘:

$ cat null.c
#include <stdio.h>
int main() {
 printf("%s\n", (void *)0);
}

确实产生了所需的输出:

(null)

在 gcc 和 clang 上。

请注意,该标准并未强制执行以下操作:

s如果不存在 l 长度修饰符,则参数应为指针 到字符类型数组的初始元素。280) 字符 数组中的内容被写入(但不包括)终止处 空字符。如果指定精度,则不超过那么多 字节被写入。如果未指定精度或精度更高 大于数组的大小,则数组应包含空字符。

依靠这种行为可能会带来惊喜!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何打印嵌入空值的字符串,以便用“(null)”替换“\0” 的相关文章

随机推荐