如何从C中的函数返回字符串?

时间:2015-11-18 17:34:34

标签: c

我正在处理以下作业问题:

  

将名字和姓氏作为参数,编写代码   函数createFBlink()。这些函数返回一个facebook链接   它充当facebook用户的备用电子邮件。变量   持有facebook链接应该包含最小字节数   需要存储代表facebook链接的字符串。如果有   没有名字或姓氏,该函数返回NULL

     

例如,如果firstname = tzuyulastname = chou,则为。{   facebook链接为chou.tzuyu@facebook.com

(参见原始问题陈述here。)

我一直试图将createFBlink的字符串返回main。我已尝试过多种方法,例如将char变为静态,但我不断收到我不理解的错误,因为我没有很多C语言经验。

我使用malloc时运气最好,但是我遇到了一个问题,即如果有功能的参数我从主发送,我结束了输入后崩溃。到目前为止,这是我的代码:

    #include <string.h>
#include <conio.h.>
#include <stdio.h>
#include <stdlib.h>

char *createFBlink(char *firstname , char *lastname) ;

int main(void)
{
    char firstname[24] , lastname[24], fblink[24] ;

    printf("Enter first name: ");
    scanf("%s", firstname);
    firstname[strlen(firstname)] = '\0';
    printf("\n Enter last name: ");
    scanf("%s", lastname);
    lastname[strlen(lastname)] = '\0';


    *fblink = createFBlink(firstname, lastname);
    if(*firstname == '\0'){
        printf("no facebook link generated");
    }else{
        printf("%s", *fblink);
    }
    getch();
    return 0;
}

char * createFBlink(char *firstname , char *lastname)
{
    int check1 = strlen(firstname) , check2 = strlen(lastname), num = check1+check2;
    char link = (char*) malloc(sizeof(char) * num);
    if(check1 == 0 || check2 == 0){
        *firstname = '\0' ;
    }else{

        strcat(*lastname, ".");
        strcat(*lastname, firstname);
        strcat(*lastname, "@facebook.com");
        strcpy(link , *lastname);
        return link;
    }
}

2 个答案:

答案 0 :(得分:1)

*link = (char *) malloc(24);

这是不正确的,应该是

link = (char *) malloc(24);

*link(与link[0]相同)是link指向的字符串的第一个字符,该赋值只是覆盖字符,而不是更改指针。

以下内容也不正确:

*fblink = createFBlink(firstname, lastname);

这:

strcat(*lastname, ...);

以同样的方式不正确。您将获取lastname指向的字符串的第一个字符,将其转换为指针并将此(显然无效)指针传递给strcat。这是崩溃的最可能原因。 此外,24个字符可能不足以容纳连接的字符串。

尝试阅读一本关于在C中使用指针的书,试图通过反复试验来理解它们可能不是最有效的方法。

答案 1 :(得分:0)

使用字符串时,您需要了解正在使用的类型。

这是内存中固定区域的固定区域。

char buffer [24];

这是一个必须释放的动态分配缓冲区

char* szBuffer = malloc(24);
free(szBuffer)

而不是正确地执行此操作,您的createFBlink执行malloc两次,并且释放零次。

如果从函数返回malloc'ed缓冲区,则仍必须释放它。

char * result = createFBlink(stuff);
free(result);

由于类型不同,您需要使用另一个函数将字符串数据从一个移动到另一个。

char * result = createFBlink(stuff);
strcpy(fblink, result, sizeof(fblink));
free(result);

然后在分配的空间外写作会带来额外的风险。让我们尝试一些带有一些常用名称的虚构名称。

firstname "Richard"
lastname  "Hernandez"
returned string "Hernandez.Richard@facebook.com" 

哦,看看,24个字符的字符串中有31个字符。我们只是在您的计算机上某处覆盖某些内容。从字面上看,现在任何事都可能发生。

所以你有各种各样的风险。你必须免费匹配malloc。你必须跟踪大小。所有这些都被认为是非常糟糕的c ++风格。强烈建议使用std :: string类。您希望您的字符串类能够处理所有资源管理,因此您在使用它时不会搞砸它。

std::string CreateFacebookLink (const std::string &firstname, const std::string &lastname){
    return firstname + "." + lastname + "@facebook.com";
}

std::string strFacebookLink (CreateFacebookLink("Richard", "Hernandez"));