2015-11-18 51 views
-4

我正在下面作业的问题:如何从C中的函数返回字符串?

鉴于姓和名作为参数,写的 功能createFBlink()代码。这些函数返回一个facebook链接 ,它作为Facebook用户的备用电子邮件。持有facebook链接的变量 应包含存储表示facebook链接的字符串所需的最小字节数 。如果 不是名字或姓氏,则函数返回NULL

例如,如果firstname = tzuyulastname = chou, 的脸书链接是[email protected]

(查看原始问题陈述here

我一直在试图将一个字符串返回从createFBlinkmain。我已经尝试了多种方法,例如将char变成静态,但我不断收到我无法理解的错误,因为我没有很多C的使用经验。

我使用malloc ,但我遇到了一个问题,其中如果有从我从main发送的函数的参数,我最终会在输入后崩溃。这里是我到目前为止的代码:

#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; 
    } 
} 
+0

什么是崩溃?什么线路导致它? (即使你不明白) –

+0

启用警告并尝试重新编译。 – this

+0

如果你想发布问题,你至少可以在这里重新输入,而不是发布一个链接到你的老师的powerpoint图片 – dietbacon

回答

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

这是不正确,应该是

link = (char *) malloc(24); 

*link(同link[0])是link指向字符串的第一个字符,该分配只是覆盖字符,而不是改变指针。

下面的内容也是不正确的:

*fblink = createFBlink(firstname, lastname); 

此:

strcat(*lastname, ...); 

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

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

+1

'link =(char *)malloc(24)'是[技术上正确,但是样式不佳](http://stackoverflow.com/a/605858/824425)。 –

+0

@Rhymoid,你说得对,但是如果没有演员阵容,它将无法通过C++编译器进行编译,那是一种“肌肉记忆”输入。不知道我是否需要编辑答案。 – Paul

+0

嗨!在处理指针时我有一些知识,但动态分配对我来说是一个非常新的主题。实际上,代码中存在的一些错误是因为挫折和试错。 我真的很难过的一件事是 * fblink = createFBlink(firstname,lastname); 我不知道这是如何工作,没有以前的答案有这样的事情。 – Jake

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 "[email protected]" 

哦,看一下,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"));