C语言返回字符串第n个字符的函数运行异常问题求解
问题原因及解决方案
核心错误点
- 字符串输出语义错误:
&input[position]拿到的是原字符串第position位的首地址,属于char*类型,使用printf("%s", 指针)时,C语言会从该地址开始逐个输出字符,直到碰到字符串结束符\0才停止,因此会输出从目标位置开始的所有后续字符。 - 内存操作逻辑错误:你先给
result申请了100字节的堆内存,下一行直接把result赋值为&input[position],直接丢失了申请的内存地址,造成内存泄漏,同时返回的其实是原字符串的只读地址,完全没有用到申请的内存。
修复方案
方案1:返回单个字符(最适配需求)
直接修改函数返回值为char类型,不需要额外申请内存,用%c格式化输出单个字符即可:
#include <stdio.h> char test(char input[],int position){ return input[position]; } int main(){ char k; k=test("abcdefghi\n",3); printf("%c",k); return 0; }
方案2:返回字符串格式的单个字符(适配字符串处理场景)
如果后续需要对接字符串处理接口,可以将目标字符写入申请的内存,末尾补\0作为字符串结束符,使用完后记得释放堆内存:
#include <stdio.h> #include <stdlib.h> char *test(char input[],int position){ // 单个字符+结束符只需要2字节内存即可 char *result= malloc(sizeof(char)*2); if(result == NULL) return NULL; result[0] = input[position]; result[1] = '\0'; return result; } int main(){ char *k; k=test("abcdefghi\n",3); if(k != NULL){ printf("%s",k); free(k); } return 0; }
内容的提问来源于stack exchange,提问作者sassyfox
相关产品推荐
相关产品推荐

