2

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

3 回答 3

1

理论上,两个字符串都应该在末尾有空终止字符 ( '\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);
}
于 2015-08-26T08:46:47.963 回答
1

为什么针的大小必须至少比针中的实际文本大一个字符?这是因为空字符吗?

是的,正是因为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是小字符串,因此'\0'需要终止它。

于 2015-08-26T08:18:41.900 回答
0

干草堆也不好。您确实需要为结尾的 NULL 字节留出空间,以便函数知道字符串在哪里结束。否则,他们将继续读取内存,直到遇到恰好在那里的 NUL。

如果你从 haystack 中去掉多余的字符,寻找 needle"f"可能实际上会返回一个结果,这一切都取决于内存中包含的内容。

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

于 2015-08-26T07:01:44.903 回答