在C中,是否可以创建一个没有'\0(null)'的字符串?

Gam*_*der 3 c arrays null

我的意思是,据我所知,当出现“null value(\0)”时,字符串将“结束”。

许多函数都与字符串返回值有关,并在字符串中遇到“空值”时立即转义。

但是,如果字符串中没有空值怎么办?

是否有可能创建这样的字符串?

比如,是否可以创建一个数组

char cArray[100] ={};
Run Code Online (Sandbox Code Playgroud)

并填写所有索引,不带“null”?。

如果是这样,“指示根本没有空值的字符串结尾”的最佳方法是什么?

如果其中没有空值,它还是“字符串”吗?

pmg*_*pmg 11

是否有可能创建这样的字符串?

您可以拥有不带零元素的 char 数组。这些不是字符串。

比如,是否可以创建一个数组

char cArray[100]; // the original had the illegal initializer = {};
Run Code Online (Sandbox Code Playgroud)

并填写所有索引,不带“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)

如果其中没有空值,它还是“字符串”吗?


And*_*nle 8

但是,如果字符串中没有空值怎么办?

那么它就不是一个字符串了。 “字符串”由C11 标准(草案)中的7.1.1 术语定义第 1 段定义:

字符串是由第一个空字符终止并包含第一个空字符的连续字符序列。有时使用术语多字节字符串来强调对字符串中包含的多字节字符进行特殊处理或避免与宽字符串混淆。指向字符串的指针是指向其初始(最低地址)字符的指针。字符串的长度是空字符之前的字节数,字符串的值是按顺序包含的字符的值的序列。

如果没有“空字符”,数组就不是“字符串”

句号。


小智 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库函数,没有办法做到这一点。

总结一下:

如果其中没有空值,它还是“字符串”吗?

不 :)

  • 诸如此类的问题需要精确,以避免造成混乱。为此,“char *”*不是*字符串。有些这样的指针“指向”字符串中的字符,但这些指针本身并不是字符串。 (3认同)