【发布时间】:2011-04-27 21:59:50
【问题描述】:
菜鸟问题: 我听说填充一个 char 数组可以用 null char 提前终止。这是怎么做到的? 我已经搜索了每一个谷歌结果,但仍然空手而归。
【问题讨论】:
-
你想达到什么目的?
-
我很抱歉,但这是含糊其辞的回答方式。 (为什么 filling 会根据数组中读取的内容提前终止?)您可能想改进这个问题。现在我投票决定关闭它。
菜鸟问题: 我听说填充一个 char 数组可以用 null char 提前终止。这是怎么做到的? 我已经搜索了每一个谷歌结果,但仍然空手而归。
【问题讨论】:
你的意思是这样的:
char test[11] = "helloworld";
std::cout << test << std::endl;
test[2] = 0;
std::cout << test;
这个输出
helloworld
he
?
【讨论】:
这是一个称为“空终止字符串”的约定。如果您有一块内存,您将其视为 char 缓冲区,并且该缓冲区中有一个空字符,那么以空字符结尾的字符串就是包含从缓冲区开头开始直到并包括空字符的任何内容。
const int bufferLength = 256;
char buffer[bufferLength] = "somestring"; //10 character plus a null character put by the compiler - total 11 characters
这里编译器将在“somestring”之后放置一个空字符(即使您不要求这样做)。因此,即使缓冲区的长度为 256,所有使用空终止字符串(如 strlen())的函数都不会读取位置 10 处的空字符。
这就是“提前终止”——缓冲区中的任何数据都超出了空字符,任何设计用于处理空终止字符串的代码都会忽略它。最后一部分很重要——代码很容易忽略空字符,然后空字符就不会发生“终止”。
【讨论】: