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
相关产品推荐
相关产品推荐

