You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义ft_strstr函数返回值输出异常:为何返回&str[2]却打印'ab'而非'a'

为什么return (&str[i]);输出的是"ab"而非"a"?

这是一个很典型的对C语言字符串和指针行为的误解,我来帮你理清这个问题:

核心原因:C语言中字符串的本质与printf("%s")的行为

在C语言里,字符串是以'\0'作为结束标志的字符数组,而char*类型的指针指向的是这个字符数组的起始位置。当你使用printf("%s", ptr)时,它会从ptr指向的位置开始,逐个输出字符,直到遇到'\0'才停止——而不是只输出单个字符。

结合你的代码实例分析

你的dest数组是"a ab",它在内存中的存储形式是:

索引:  0   1   2   3   4
字符: 'a' ' ' 'a' 'b' '\0'

当你的ft_strstr函数进入if (to_find[j] == '\0')分支时,i=2,j=2,此时&str[i]指向的是索引为2的字符'a'。而从这个位置开始,后续的字符是'b'和'\0',所以printf("%s", &str[2])会输出从这个位置开始的所有字符,也就是"ab"。

你误解的点

你以为返回的是单个字符'a',但实际上你的函数返回的是char*类型的指针——它指向的是子串第一次出现的起始位置,而非单个字符。这完全符合标准库strstr()的行为:标准strstr也是返回子串起始位置的指针,当用printf("%s")输出时,自然会打印从该位置到字符串结束的所有内容。

验证单个字符的输出

如果你只想输出匹配到的第一个字符,可以用%c格式符,并且解引用返回的指针:

printf("%c", *ft_strstr(dest, i)); // 这会输出 'a'

补充:你的ft_strstr逻辑是正确的

顺便提一句,你的自定义函数逻辑是符合strstr的预期行为的——当找到子串时返回起始指针,没找到返回NULL,空子串返回原字符串,这些都没问题。

内容的提问来源于stack exchange,提问作者Maria Barroso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:57:44