理论上,两个字符串都应该在末尾有空终止字符 ( '\0
),因为函数不知道何时停止读取字符串:
取strlen
功能。它读取字符串的长度直到空字符,并且可以像这样实现:
size_t strlen(const char* str)
{
size_t len = 0;
for(; *str; ++str, ++len);
return (len);
}
请注意,条件是*str
,它也可以表示*str != 0
,这表明 for 循环递增字符串和长度,直到找到一个空字符。
但是,如果没有给出空终止符(例如,您分配char[5]
给"Hello"
,实际上应该是char[6]
- "Hello\0"
),如果您使用的函数在“hello”结尾处停止,那将是纯粹的运气。
为了更容易,如果您正在编写一个字符数组,您可以不将数字包含在大括号中,并允许编译器为您推断它以确保有一个空终止字符:
const char haystack[] = "IDontUnderstand?Help!";
const char needle[] = "?";
请注意,您不能把const char haystack[strlen("IDontUnderstand?Help!") + 1] = "IDontUnderstand?Help!";
asstrlen("IDontUnderstand?Help!") + 1
不是一个常数值。
但是,如果要动态分配内存,可以使用strlen
来帮助:
char* get_str_buffer(const char* value)
{
char* buf = malloc(strlen(value) + 1);
strcpy(buf, value);
return (buf);
}
int main(void)
{
const char *haystack = get_str_buffer("IDontUnderstand?Help!");
const char *needle = get_str_buffer("?");
char *buffer;
buffer = strstr(haystack, needle);
printf("The substring is: %s\n", buffer);
free(haystack);
free(needle);
return(0);
}