c - strstr 函数中针的大小

标签 c strstr string.h

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

相关文章:

c - 为什么我总是用 rand() 得到相同的随机数序列?

c - 确定 C 缓冲区中的多个空格分隔的输入

c++ - 在 C MBED 中使用 strstr,打印结果

c - <string.h> 中的 strset 函数,C

c++ - 在单独的文件夹中编译对象,隐式规则不匹配

c - 如何强制 printf 在 c 中返回负值?

c - 如何抑制阴影 "index"警告?

string-comparison - strcmp() 对于相同字符串比较返回不同的值

c - C中的socket send()卡住

c - strstr 函数不返回 NULL