我编写了该函数来标记整个字符串并连接每个标记的空间和字符串长度。 我的函数是
主要功能
char *final_buff = NULL;
data_token(databuf,&final_buff);
之后我打电话
free(final_buff);
功能:
int data_token(char *buffer,/*user_strinf*/
char **final_buff)/*store each token*/
{
char *token_arr;
char temp[10];
int length = 0;
token_arr = strtok(buffer,",");/*find first token*/
while (token_arr != NULL)
{
printf("tokens--%sn",token_arr);
length = length + strlen(token_arr)+4;
*final_buff = realloc(*final_buff,(length)*sizeof(char));/*allocate memory for the buffer*/
if (NULL == *final_buff)
{
printf("token memory allocation errorn");
exit(1);
}
strcat(*final_buff,token_arr);/*concatinate the token to buffer*/
strcat(*final_buff," ");
sprintf(temp,"%d",strlen(token_arr));
strcat(*final_buff,temp); /*concatinate buffer with string length */
strcat(*final_buff," ");
token_arr = strtok(NULL , ",");/*read next token */
}
return 1;
}
当我调用这个函数时,这个分配会起作用.因为我害怕在使用该数组添加空格和整数时应该分配多少长度.正确吗?我得到了分段错误或核心转储.
*final_buff
应始终以 null 结尾。
当它第一次被分配时,realloc
,它可能不会以 null 结尾。您正在写入它strcat
,这要求缓冲区已经以 null 结尾。
在main
,你可以写
char *final_buff = malloc(sizeof(char)); // allocate 1 char
// todo: error checking
*final_buff = 0; // null-terminate
data_token(databuf,&final_buff);
行
strcat(*final_buff,token_arr);/*concatinate the token to buffer*/
在循环的第一次迭代中将是一个问题。
您还假设字符串的长度永远不会需要超过 1 个空格。您可以通过执行以下命令来消除该假设
sprintf(temp,"%d",strlen(token_arr));
在循环的早期并使用strlen(temp)
来计算*final_buff
所需的长度。
我建议对while
循环进行以下更新:
while (token_arr != NULL)
{
printf("tokens--%sn",token_arr);
sprintf(temp,"%d",strlen(token_arr));
// +3 -> two spaces and the terminating null character.
length = length + strlen(token_arr) + strlen(temp) + 3;
if ( *final_buff == NULL )
{
// No need to use length*sizeof(char). sizeof(char) is
// guaranteed to be 1
*final_buff = malloc(length);
(*final_buff)[0] = ' ';
}
else
{
*final_buff = realloc(*final_buff,(length));/*allocate memory for the buffer*/
}
if (NULL == *final_buff)
{
printf("token memory allocation errorn");
exit(1);
}
strcat(*final_buff,token_arr); /*concatinate the token to buffer*/
strcat(*final_buff," ");
strcat(*final_buff,temp); /*concatinate buffer with string length */
strcat(*final_buff," ");
token_arr = strtok(NULL , ",");/*read next token */
}
如果要将值转换为字符串并且需要确保不会溢出缓冲区,请使用snprintf()
。
http://man7.org/linux/man-pages/man3/printf.3.html
返回值
成功返回后,这些函数返回 打印的字符(不包括用于结束输出的空字节 字符串)。
函数 snprintf() 和 vsnprintf() 写入的大小不超过 字节(包括终止空字节 ('\0'))。如果输出是 由于此限制而被截断,则返回值是 字符(不包括终止的空字节),这些字符本来是 如果有足够的可用空间,则写入最后一个字符串。因此 大小或更大的返回值表示输出被截断。 (另请参阅下面的注释。
如果遇到输出错误,则返回负值。