有一个
typedef struct person {
char name[20]
char surname[20]
} person_t;
我需要像XXXXXX:YYYYYY
这样的函数创建一个字符串
char* personToString(person_t *p)
。我试着去做:
char* personToString(person_t* p) {
int n1,n2;
n1=strlen(p->name);
n2=strlen(p->surname);
char *p = (char*) malloc((n1+n2+2)*sizeof(char));
strcat(p,puser->name);
strcat(p,":");
strcat(p,puser->surname);
return p;
}
这给了我一个合理的输出,但是我用valgrind测试了一些错误!我也认为有一种方法可以更好地编写函数!
答案 0 :(得分:3)
当你为p
的malloc内存时,内存将保存垃圾值。 Strcat将在空字符后附加一个字符串,但在未初始化的字符串中将保留随机值。
用strcpy替换第一个strcat。
答案 1 :(得分:3)
你需要
strcpy(p,puser->name);
不
strcat(p,puser->name);
malloc
没有将缓冲区初始化为零,因此strcat首先在p中搜索空字节,可能找不到一个,读取超过缓冲区的末尾然后崩溃。
除了一个strcpy加两个strcat,你还可以写一个sprintf调用:
sprintf(p, "%s:%s", puser->name, puser->surname);
答案 2 :(得分:2)
首先你应该调用字符串副本,然后调用strcat:
strcat(p,puser->name);
应该是:
strcpy(p,puser->name);
因为使用malloc函数分配的内存保持值为垃圾,首先执行strcat,然后在垃圾后连接 - 它还会在代码中引入未定义的行为。
你可以使用void* calloc (size_t num, size_t size);
代替malloc(),用0
初始化已分配的内存的calloc函数(然后strcat()没问题)。
还要动态分配内存,您应该使用void free (void* ptr);)
显式释放内存块。
答案 3 :(得分:2)
这对我来说很好,
char* personToString( struct person_t *p )
{
int len = strlen(p->name) + strlen(p->surname) + 2; // holds ':' + NULL
char *str = malloc( len ); // Never cast malloc's return value in C
// Check str for NULL
if( str == NULL )
{
// we are out of memory
// handle errors
return NULL;
}
snprintf( str, len, "%s:%s", p->name, p->surname);
return str;
}
注意:强>
malloc
的返回值。snprintf
时使用strcat
,优雅。free
在调用方中返回值str
。 修正了struct
和char
个变量。