从函数返回字符串没有给出正确的输出

时间:2015-08-31 11:41:20

标签: c string

我试图制作一个能从用户那里收到char *的功能并打印出来。

当我打印它时,它将我的价值变成了一种奇怪的东西。

**//input method**

char* readContactName(){
    char tmp[20];
    do{
    printf("What is your contact name?: (max %d chars) ", MAX_LENGH);
    fflush(stdin);
    scanf("%s", &tmp);
    } while (!strcmp(tmp, ""));

    return tmp;
}

void readContact (Contact* contact) 
{

    char* tmp;

    tmp = readContactName();
    updateContactName(contact, tmp);
}

**//when entering this function the string is correct**
void updateContactName(Contact* contact, char str[MAX_LENGH])
{
    printf("contact name is %s\n",&str);  --> prints rubish
}

我在这里想念的是什么?

1 个答案:

答案 0 :(得分:4)

在您的代码中,char tmp[20];是函数readContactName()的本地代码。函数完成执行后,就不存在tmp。因此,tmp的地址也会失效。

因此,在return之后,在调用方中,如果您尝试使用return ed指针,(就像您在updateContactName(contact, tmp);()中所做的那样 )它会调用undefined behaviour

FWIW,fflush(stdin);也是UB。 fflush()仅为输出流定义。

解决方案:

  • tmp定义为指针。
  • 动态分配内存(使用malloc()或系列)。
  • 使用分配的内存完成后,您还需要free()