检查非空终止字符串的有效性

时间:2016-02-11 02:11:26

标签: c strlen null-terminated

我无法绕着null终结符和非null终止数组包裹我的大脑。

我们说我有两个声明:

const char *string = "mike";

const char string[4] = {'m', 'i', 'k', 'e'};

我理解第一个声明是因为在C中,字符数组是空终止的,因为它被定义为内存中以NULL结尾的连续字符块,我可以用strlen来检查它。 / p>

我遇到的问题是理解第二个声明,没有空终结符。

如何检查没有空终止符的字符串的有效性? (如果在数组中有其他值,该怎么办?)

3 个答案:

答案 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)或使用strcmpstrcpystrlen等功能,则无效。确实,字符串只是一个带有空终止符的字符数组,但是如果要考虑字符串,则需要使用空终止符。因此,如果您不确定实际上是否有一个空终止的字符数组,则需要检查空终止符。

这种区别非常重要,但是相似之处可以用于您的优势,特别是当您进入嵌入式编程并通过线路恢复字符时。我们只是说你有一个缓冲区,你将复活的字符放入,你正在寻找字符串“迈克”。您很可能不会通过电线接收空终止符,因此当您搜索字符串时,您需要单独比较字符或使用strncmp,它只比较您告诉它的字符数如果您有一个硬编码字符串,则可以使用strlen来获取用于strncmp的字符串的大小。