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

C语言字符串指针偏移未指向指定位置 两次打印结果相同问题排查

问题原因
  • 首先明确:char*类型指针加80的运算逻辑本身是正确的,就是向后偏移80个char长度的地址,也就是指向myString[80]的位置,你观察到的异常现象主要有两个常见诱因:
    1. 字符串内容巧合:你初始化的myString前80个字符结束后,紧接着的内容和字符串开头高度重合,导致你误以为两次输出完全一致,实际上第二部分输出的后半段和第一部分存在差异。
    2. 调试观察误差:部分调试工具显示字符指针时,默认只输出从指针位置开始到首个特殊符号/空格为止的内容,刚好前后两段的开头内容一致,会让你误以为offset没有发生偏移。
  • 额外说明:你代码中sscanf读取内容到buf后完全没有被使用,属于无效冗余代码,不影响当前运行结果但可以直接删除。
解决方案

你可以按照以下步骤修正代码,验证效果同时实现稳定的分段打印需求:

  1. 首先可以加调试代码确认指针偏移逻辑正常,在offset赋值后打印指针地址和对应首字符,验证偏移量:
offset = myString + 80;
// 新增调试代码
printf("myString地址:%p,offset地址:%p,地址差:%lld\n", myString, offset, (long long)(offset - myString));
printf("myString首字符:%c,offset首字符:%c\n", *myString, *offset);
  1. 完整的分段打印参考代码如下,添加了分段分隔线避免内容混淆,同时兼容不足80字符的最后一段输出:
#include <stdio.h>

// 替换非标准的void main为标准写法,提升跨编译器兼容性
int main(void)
{
    char myString[1024] = "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praeseAt vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.";
    const int seg_length = 80;
    char* cur_ptr = myString;
    int str_total_len = sizeof(myString);

    // 循环分段打印,不需要冗余的buf变量和sscanf逻辑
    while (cur_ptr < myString + str_total_len && *cur_ptr != '\0') {
        int write_len = seg_length;
        // 最后一段不足80字符时按实际剩余长度打印
        if ((myString + str_total_len - cur_ptr) < seg_length) {
            write_len = myString + str_total_len - cur_ptr;
        }
        fwrite(cur_ptr, 1, write_len, stdout);
        // 加分隔线明确区分不同分段,避免内容巧合导致的误判
        printf("\n---------- 分段分隔线 ----------\n");
        cur_ptr += seg_length;
    }

    return 0;
}

运行修正后的代码即可通过分隔线清晰区分两次输出的差异,同时确认指针偏移逻辑正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:06:01