编写字符串重排函数时,malloc分配的字符串仅返回首字符求助
问题分析与修复
你的代码核心问题是访问了字符串的终止符位置,导致新字符串提前被截断。
在循环中,s[len - i] 是错误的索引:字符串 s 的有效字符索引范围是 0 到 len-1,s[len] 是字符串末尾的 '\0' 终止符。当 i=0 时,你把这个终止符写入了 ans[1] 的位置——这就意味着,外部读取返回的字符串时,遇到第一个终止符就会停止,所以只能看到第一个字符。而你逐个打印 ans 的字符时,是直接按索引访问,不会被中间的终止符打断,所以看起来显示正常。
修复方案
把 s[len - i] 改为 s[len - 1 - i],这样就能正确取到字符串末尾的对应字符:
char * solution(char * s) { int len = strlen(s); int i; int index = 0; char *ans = (char *) malloc(sizeof(char) * (len + 1)); if (ans == NULL) { fprintf(stderr, "Ran out of space in some function \n"); exit(1); } ans[len] = '\0'; for(i = 0; i < len/2; i++){ ans[index++] = s[i]; // 修正索引:取末尾倒数第i+1个有效字符 ans[index++] = s[len - 1 - i]; } if(len % 2 == 1){ ans[index] = s[len/2]; } return ans; }
验证示例
比如输入字符串 "abcde"(长度5):
- 修复前:
i=0时写入s[0]='a'和s[5]='\0',ans变成"a\0bdc",外部读取仅显示"a" - 修复后:
i=0写入'a'和'e',i=1写入'b'和'd',最后写入中间字符'c',最终ans为"aebdc",符合预期
内容的提问来源于stack exchange,提问作者jendeukstan
相关产品推荐
相关产品推荐

