C - 从"创建一个字符串" struct参数

时间:2013-07-18 08:14:40

标签: c string strcat

有一个

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测试了一些错误!我也认为有一种方法可以更好地编写函数!

4 个答案:

答案 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;
}

注意:

  1. 永远不要在C中投射malloc的返回值。
  2. 当需要多个snprintf时使用strcat,优雅。
  3. free在调用方中返回值str
  4. 修正了structchar个变量