【问题标题】:How to store '\0' in a char array如何将 '\0' 存储在 char 数组中
【发布时间】:2017-01-08 17:56:22
【问题描述】:

是否可以将 char '\0' 存储在 char 数组中,然后存储不同的字符?例如

char* tmp = "My\0name\0is\0\0";

我被教导在 C 中实际上称为字符串列表,但是当我尝试打印上面的内容时(使用printf("%s\n", tmp)),它只打印了

“我的”。

【问题讨论】:

  • 你怎么知道它只保存了My?它可能保存了整个序列,但打印功能在“看到”空字符 \0 后停止
  • 正确,已编辑。那么如何才能全部打印出来呢?
  • 您应该发布用于打印 tmp 的代码——问题在于该代码,而不是能够将 \0 存储在 char 数组中
  • printf(%s\n", tmp);

标签: c string printf


【解决方案1】:

是的,当然可以,但是,此外,您不能将该数组用作 string 并获取存储在 '\0' 之后的内容。

根据定义,字符串是一个char数组,空字符'\0'结束。所有与字符串相关的函数都会在终止的空字节处停止(例如,一个参数,在实际内容之间包含一个'\0',传递给printf() 中的格式说明符%s)。

引用C11,第 §7.1.1 章,术语定义

字符串是连续的字符序列以第一个 null 结尾并包括 字符。 [...]

但是,对于逐字节处理,只要您留在分配的内存区域内,您就可以继续进行。

【讨论】:

  • 那么我怎样才能打印整个东西呢?
  • @UFCInsider 遍历数组,获取每个元素并打印它们,可能使用%c。不过请记住保持在数组限制范围内。
  • @UFCInsider 因为if (*(p + i) == '\0')) 中的语法错误。
  • 谢谢...我可能会问这个问题
  • @UFCInsider 有道理。谢谢。
【解决方案2】:

您遇到的问题是您用于打印tmp 的功能。像 printf 这样的函数会假设字符串是空终止的,所以它会在看到第一个 \0

时停止

如果您尝试以下代码,您将在tmp 中看到更多值

int main(int c,char** a){
    char* tmp = "My\0name\0is\0\0";
    write(1,tmp,12);
}

【讨论】:

  • 我编辑了我的问题。我的打印方式有什么问题?
  • @UFCInsider -- 这确实是一个新问题,不再是How to store '\0' in a char array -- 创建一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多