我正在处理以下作业问题:
将名字和姓氏作为参数,编写代码 函数
createFBlink()
。这些函数返回一个facebook链接 它充当facebook用户的备用电子邮件。变量 持有facebook链接应该包含最小字节数 需要存储代表facebook链接的字符串。如果有 没有名字或姓氏,该函数返回NULL
。例如,如果
firstname = tzuyu
和lastname = 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;
}
}
答案 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"));