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

C语言如何打印两个指针所指向区间内的子字符串?

方案1:使用printf精度限定符(最优推荐,无额外内存开销、不修改原数据)

printf的%s格式符支持通过.*前缀动态指定输出的最大字符长度,完全不需要子串带有末尾空终止符,也不需要额外申请内存,完美匹配你内存敏感的使用场景。
子串长度可以直接通过两个指针相减得到:pEnd - pStart,示例用法如下:

// 原文本
char *pText  = "We've sold the Earch!";

// 子串`sold`,修正原代码的指针错误:pText本身是char*,偏移后直接是目标地址,不需要额外取地址&
char *pStart = pText + 6; // 指向字符's'
char *pEnd   = pStart + 4; // 指向字符'd'的下一位,子串长度为4

// 打印子串,%.*s 第一个参数传长度,第二个传子串起始指针
printf("sold: %.*s", (int)(pEnd - pStart), pStart);

注意指针相减的结果类型是ptrdiff_t,转型为int即可适配printf的精度参数要求。


方案2:临时修改原字符串(仅适用于可写堆内存场景)

如果你需要把子串传给其他要求空终止的C字符串函数,且你的pText确实存储在可写的堆内存(注意:示例中的字符串字面量属于只读内存,修改会触发段错误,堆内存不存在该问题),可以用临时替换的方式:

// 先保存pEnd位置的原字符
char old_char = *pEnd;
// 替换为空终止符
*pEnd = '\0';
// 此时pStart就是合法的空终止字符串,可以正常使用
printf("sold: %s", pStart);
// 用完必须把原字符写回,避免破坏原字符串
*pEnd = old_char;

该方案的缺点是线程不安全,如果有其他线程同时读取原字符串,会读到截断的异常内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:24:02