我的意思是,据我所知,当出现“null value(\0)”时,字符串将“结束”。
许多函数都与字符串返回值有关,并在字符串中遇到“空值”时立即转义。
但是,如果字符串中没有空值怎么办?
是否有可能创建这样的字符串?
比如,是否可以创建一个数组
char cArray[100] ={};
Run Code Online (Sandbox Code Playgroud)
并填写所有索引,不带“null”?。
如果是这样,“指示根本没有空值的字符串结尾”的最佳方法是什么?
如果其中没有空值,它还是“字符串”吗?
pmg*_*pmg 11
是否有可能创建这样的字符串?
您可以拥有不带零元素的 char 数组。这些不是字符串。
比如,是否可以创建一个数组
Run Code Online (Sandbox Code Playgroud)char cArray[100]; // the original had the illegal initializer = {};并填写所有索引,不带“null”?。
是的,这是完全合理的( memset(cArray, '*', 100);)。但是cArray(或其任何部分)不会是字符串。
如果是这样,“指示根本没有空值的字符串结尾”的最佳方法是什么?
如果您想使用不带指示符的字节序列,则需要单独进行计数。
char NotAString[6] = "abcdef";
size_t n = 6;
// remove the 'f' from NotAstring
n = 5;
// remove the 'b'
memmove(NotAString + 1, NotAString + 2, 3);
n -= 1;
// the first `n` (4) bytes of NotAString are now 'a', 'c', 'd', and 'e'
// don't care about bytes 5 and 6
Run Code Online (Sandbox Code Playgroud)
如果其中没有空值,它还是“字符串”吗?
不。
小智 7
你完全可以拥有一个没有 null 终止符的 char 数组(它毕竟像一个 int 数组),但它不是一个字符串(根据定义),并且你将无法使用与字符串相关的所有标准 C 函数,因为它们都依赖于终结者的存在。
最后,您必须将字符数组视为通用数组。
小智 6
这实际上取决于您的最终目标是什么。
但是,如果字符串中没有空值怎么办?
任何采用char*参数(字符串)的标准 C 库函数都需要一个 null 终止符。如果您不在字符串末尾添加一,则无论函数采用未终止的字符串,都只会继续读取超出字符串末尾(即 UB)的内容。
是否有可能创建这样的字符串?
嗯,是的,但它不会很有用。您可以分别存储长度和字符串并执行如下操作:
char myString[100] = { ... } // unterminated string
size_t myStringLength = 100;
for (int i = 0; i < myStringLength; i++)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于您自己的实现,同样,没有标准 C 库函数支持此功能。
是否可以创建一个数组并填充所有索引而不使用“null”?
再说一次,是的。数组只是一个数组,而这个数组实际上只是一个“数字”数组。正如 Jabberwocky 提到的,字符串是通过末尾有一个空终止符来定义的。
如果是这样,“指示根本没有空值的字符串结尾”的最佳方法是什么?使用标准C库函数,没有办法做到这一点。
总结一下:
如果其中没有空值,它还是“字符串”吗?
不 :)