strstr 函数中针的大小

Size of Needle in strstr function

这是一个简单的问题,但是,当我使用 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);
}

大海捞针也不好。您确实需要为尾随的 NULL 字节留出空间,以便函数知道字符串的结尾位置。否则他们将继续读取内存,直到遇到恰好存在的 NUL。

如果你从大海捞针中去掉额外的字符,寻找针 "f" 实际上可能 return 结果,这完全取决于内存恰好包含什么。

这就是为什么使用 const char* 来保存字符串文字是更好的风格的部分原因。仅在代码中构造值时使用数组。

why does the size of the needle have to be at least one character bigger than the actual text in the needle? Is this because of the null character?

是的,正是因为null character。如果你看到 strstr() 的格式是这样的 -

char *strstr(const char *haystack, const char *needle)

需要的参数是 -

haystack -This is the main C string to be scanned.

needle -This is the small string to be searched with-in haystack string.

由于needle是一个小字符串,因此需要'[=16=]'来终止它。

理论上,两个字符串的末尾都应该有空终止字符 ('[=13=]),否则函数不知道何时停止读取字符串:

采取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[=20=]"),它是如果您使用的函数在 "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);
}