我无法绕着null终结符和非null终止数组包裹我的大脑。
我们说我有两个声明:
const char *string = "mike";
和
const char string[4] = {'m', 'i', 'k', 'e'};
我理解第一个声明是因为在C中,字符数组是空终止的,因为它被定义为内存中以NULL结尾的连续字符块,我可以用strlen
来检查它。 / p>
我遇到的问题是理解第二个声明,没有空终结符。
如何检查没有空终止符的字符串的有效性? (如果在数组中有其他值,该怎么办?)
答案 0 :(得分:3)
你不能。没有null终止符的字符串不是字符串。它只是一个字符数组。 C字符串必须具有空终止符才能被视为字符串。
您必须像使用int[]
数组或任何其他类型的数组一样处理它:如果它不是已知的固定大小,请分别跟踪大小。由于它不是字符串,因此您无法调用strlen
之类的字符串函数。
答案 1 :(得分:3)
如何检查没有空终止符的字符串的有效性?
您需要知道数组边界,以查看边界内是否包含以null结尾的字符串。以下是您在示例中如何做到这一点:
const char string[4] = {'m', 'i', 'k', 'e'};
int good = 0;
for (int i = 0 ; i != sizeof(string) ; i++) {
if (string[i] == '\0') {
good = 1;
break;
}
}
if (good) {
printf("String '%s' is null-terminated.\n", string);
} else {
printf("String is not null-terminated; cannot print.\n");
}
虽然C库仅支持以null结尾的字符串,但只要您可以访问其大小(即它是数组,而不是指针),就可以使用没有空终止的字符数组。例如,您可以像这样打印数组:
printf("'%.*s'\n", sizeof(string), string);
答案 2 :(得分:1)
字符串需要结束将是一个空终止符。如果您尝试在第二个示例上执行printf("%s",string)
或使用strcmp
,strcpy
或strlen
等功能,则无效。确实,字符串只是一个带有空终止符的字符数组,但是如果要考虑字符串,则需要使用空终止符。因此,如果您不确定实际上是否有一个空终止的字符数组,则需要检查空终止符。
这种区别非常重要,但是相似之处可以用于您的优势,特别是当您进入嵌入式编程并通过线路恢复字符时。我们只是说你有一个缓冲区,你将复活的字符放入,你正在寻找字符串“迈克”。您很可能不会通过电线接收空终止符,因此当您搜索字符串时,您需要单独比较字符或使用strncmp
,它只比较您告诉它的字符数如果您有一个硬编码字符串,则可以使用strlen
来获取用于strncmp
的字符串的大小。