为了账号安全,请及时绑定邮箱和手机立即绑定

从C函数返回字符串

从C函数返回字符串

C
陪伴而非守候 2019-11-13 13:35:35
我已经3年没有使用C了,在很多事情上我都非常生锈。我知道这看起来很愚蠢,但目前无法从函数返回字符串。请假设:我不能string.h为此使用。这是我的代码:#include <ncurses.h>char * getStr(int length){       char word[length];    for (int i = 0; i < length; i++)    {        word[i] = getch();    }    word[i] = '\0';    return word;}int main(){    char wordd[10];    initscr();    *wordd = getStr(10);    printw("The string is:\n");    printw("%s\n",*wordd);    getch();    endwin();    return 0;}我可以捕获字符串(使用我的getStr函数),但无法使其正确显示(我得到垃圾)。感谢帮助。
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

要么在调用方的堆栈上分配字符串,然后将其传递给函数:


void getStr(char *wordd, int length) {

    ...

}


int main(void) {

    char wordd[10 + 1];

    getStr(wordd, sizeof(wordd) - 1);

    ...

}

或将字符串设为静态getStr:


char *getStr(void) {

    static char wordd[10 + 1];

    ...

    return wordd;

}

或在堆上分配字符串:


char *getStr(int length) {

    char *wordd = malloc(length + 1);

    ...

    return wordd;

}


查看完整回答
反对 回复 2019-11-13
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您要在堆栈上分配字符串,然后返回指向它的指针。当函数返回时,所有堆栈分配都将变为无效;现在,指针指向堆栈上下次调用函数时可能会被覆盖的区域。

为了执行您要执行的操作,您需要执行以下一项操作:

  1. 使用malloc或类似方法在堆上分配内存,然后返回该指针。free完成内存后,调用者将需要进行调用。

  2. 在调用函数(将使用该字符串的函数)中在堆栈上分配该字符串,然后将指针传递给该函数以将该字符串放入其中。在对调用函数的整个调用过程中,其堆栈上的数据有效。仅当您返回该堆栈分配的空间后,其他空间才会使用它。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 563 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信