检查非空终止字符串的有效性
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)
或使用 strcmp
、strcpy
或 strlen
之类的函数,它将不起作用。的确,字符串只是一个带有空终止符的字符数组,但如果要将其视为字符串,则需要有空终止符。因此,如果您不确定是否确实有一个以 null 终止的字符数组,则需要检查 null 终止符。
这种区别非常重要,但相似之处可以为您带来优势,尤其是当您进入嵌入式编程级别并通过网络恢复角色时。假设您有一个缓冲区,您正在将恢复的字符放入其中,并且您正在寻找字符串 "mike"。您很可能不会通过线路收到空终止符,因此当您搜索字符串时,您要么需要单独比较字符,要么使用 strncmp
只比较您告诉它的字符数如果你有一个硬编码的字符串,你可以使用 strlen
来获取你用于 strncmp
.
的字符串的大小
我在思考 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)
或使用 strcmp
、strcpy
或 strlen
之类的函数,它将不起作用。的确,字符串只是一个带有空终止符的字符数组,但如果要将其视为字符串,则需要有空终止符。因此,如果您不确定是否确实有一个以 null 终止的字符数组,则需要检查 null 终止符。
这种区别非常重要,但相似之处可以为您带来优势,尤其是当您进入嵌入式编程级别并通过网络恢复角色时。假设您有一个缓冲区,您正在将恢复的字符放入其中,并且您正在寻找字符串 "mike"。您很可能不会通过线路收到空终止符,因此当您搜索字符串时,您要么需要单独比较字符,要么使用 strncmp
只比较您告诉它的字符数如果你有一个硬编码的字符串,你可以使用 strlen
来获取你用于 strncmp
.