这是一个简单的问题,但是,当我使用 strstr 函数时,为什么针的大小必须比针中的实际文本大至少一个字符?这是因为空字符吗?
当我将针设置为针[1]时,它不起作用。为什么可以为大海捞针输入准确的字符数?
#include <stdio.h>
#include <string.h>
int main(void)
{
const char haystack[21] = "IDontUnderstand?Help!";
const char needle[2] = "?";
char *buffer;
buffer = strstr(haystack, needle);
printf("The substring is: %s\n", buffer);
return(0);
}
最佳答案
理论上,两个字符串末尾都应该有空终止字符 ('\0
),因为否则函数不知道何时停止读取字符串:
采用strlen
函数。它读取字符串的长度直到空字符,并且可以像这样实现:
size_t strlen(const char* str)
{
size_t len = 0;
for(; *str; ++str, ++len);
return (len);
}
注意条件是*str
,它也可以表示*str != 0
,这表明for循环递增字符串和长度,直到出现空字符。找到了。
但是,如果未给出空终止符(例如,您为 "Hello"
分配了 char[5]
,而实际上它应该是 char[6 ]
- "Hello\0"
),如果您使用的函数停在“hello”末尾,那纯属运气。
为了更简单,如果您正在编写字符数组,则可以不将数字包含在大括号中,并允许编译器为您推导它以确保存在空终止字符:
const char haystack[] = "IDontUnderstand?Help!";
const char needle[] = "?";
请注意,您不能将 const char haystack[strlen("IDontUnderstand?Help!") + 1] = "IDontUnderstand?Help!";
设为 strlen("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);
}
关于c - strstr 函数中针的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32219786/