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

Checking validity of non null-terminated string

我在思考 null 终止符和非 null 终止数组时遇到了问题。

假设我有两个声明:

const char *string = "mike";

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

我理解第一个声明是因为在 C 中,字符数组以空值终止,因为它被定义为内存中以空值终止的连续字符块,我可以使用 strlen 进行检查.

我遇到的问题是像第二个一样理解没有空终止符的声明。

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

你不能。没有空终止符的字符串不是字符串。它只是一个字符数组。 C 字符串必须有空终止符才能被视为字符串。

您必须像处理 int[] 数组或任何其他类型的数组一样处理它:单独跟踪大小,如果它不是已知的固定大小。因为它不是字符串,所以不能调用 strlen.

这样的字符串函数

How can I check for validity of a string with no null terminator?

您需要了解数组边界才能查看边界内是否包含以 null 结尾的字符串。以下是您如何在您的示例中执行此操作:

const char string[4] = {'m', 'i', 'k', 'e'};
int good = 0;
for (int i = 0 ; i != sizeof(string) ; i++) {
    if (string[i] == '[=10=]') {
        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 结尾的字符串,但您可以使用不以 null 结尾的字符数组,只要您可以访问它们的大小(即它是数组,而不是指针)。例如,您可以像这样打印数组:

printf("'%.*s'\n", sizeof(string), string);

字符串需要以空终止符结尾。如果您尝试在第二个示例中执行 printf("%s",string) 或使用 strcmpstrcpystrlen 之类的函数,它将不起作用。的确,字符串只是一个带有空终止符的字符数组,但如果要将其视为字符串,则需要有空终止符。因此,如果您不确定是否确实有一个以 null 终止的字符数组,则需要检查 null 终止符。

这种区别非常重要,但相似之处可以为您带来优势,尤其是当您进入嵌入式编程级别并通过网络恢复角色时。假设您有一个缓冲区,您正在将恢复的字符放入其中,并且您正在寻找字符串 "mike"。您很可能不会通过线路收到空终止符,因此当您搜索字符串时,您要么需要单独比较字符,要么使用 strncmp 只比较您告诉它的字符数如果你有一个硬编码的字符串,你可以使用 strlen 来获取你用于 strncmp.

的字符串的大小