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

C语言实现Pig Latin转换功能代码运行错误问题求解

问题排查

你代码的错误集中在两个核心位置:

  • 第一个错误在appender函数的snprintf调用:returned是char*类型的指针,sizeof(returned)获取的是指针本身的内存大小(64位系统为8字节、32位系统为4字节),不是你申请的4字节内存的容量。如果运行在64位环境下,snprintf会误以为可用空间有8字节,写入时越界污染相邻内存,直接导致输出乱码。
  • 第二个错误在拼接逻辑:sprintf(tokenPtr, "%s%s ", tokenPtr, lastThree) 把同一块内存同时作为输入源和输出目标,C标准规定sprintf处理重叠内存时行为未定义,会出现输出内容异常。
  • 附加问题:appender中malloc申请的内存没有释放,存在内存泄漏;拼接时额外多追加了空格,也会导致输出格式不符合预期。

修复方案

修改后的可运行代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *appender(char s);
void shiftLeft(char [], int);

int main()
{
    // 开足够大的缓冲区避免拼接后越界
    char s[200], *lastThree;
    char temp_buf[200]; // 用于拼接的临时缓冲区,避免内存重叠
    
    fgets(s, 200, stdin);
    s[strcspn(s, "\n")] = 0;
    char *tokenPtr = strtok(s, " ");

    while(tokenPtr != NULL){
        lastThree = appender(tokenPtr[0]);
        
        shiftLeft(tokenPtr, strlen(tokenPtr));
        // 先拼接到临时缓冲区,再拷回原地址
        snprintf(temp_buf, sizeof(temp_buf), "%s%s", tokenPtr, lastThree);
        strcpy(tokenPtr, temp_buf);
        
        printf("%s ", tokenPtr);
        // 释放malloc申请的内存,避免泄漏
        free(lastThree);
        tokenPtr = strtok(NULL, " ");
    }
    
    return 0;
}

char *appender(char s){
    char *returned = (char*)malloc(sizeof(char)*4);
    // 直接传入申请的内存大小4,不要用sizeof(指针)
    snprintf(returned, 4, "%c%s", s, "ay");
    return returned;
}

void shiftLeft(char s[], int len){
    int i;
    for(i=0;i<len-1;i++){
        s[i]=s[i+1];
    }
    s[i] = '\0';
}

测试输入jump the,输出为umpjay hetay,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:24:04