gpt4 book ai didi

c - Sprintf 连接字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:08 25 4
gpt4 key购买 nike

我有一个字符串,我需要将一些数据连接到末尾。我的问题是,每次循环进行时,我都会在字符串末尾获得先前的循环数据。例如数据

第一次循环迭代 1234@3 第二次循环迭代 3462@3@124 第 3 次循环迭代 3676@3@124@67 等等..

我需要做的是接收字符串和一些数据到最后,为每个循环迭代设置字符串。

if(rank == 0)
{


char *recv_str = malloc(PRECISION);
int retVal = -10;
int len;
long exp;
char *str_exp = malloc(sizeof(char) * 8);
char *deli = "@";


for(i=1; i<= size - 1 ; i++)
{

MPI_Recv(&exp,1,MPI_LONG,i,1,MPI_COMM_WORLD,&status);
MPI_Recv(&len,1,MPI_INT,i,1,MPI_COMM_WORLD,&status);
MPI_Recv(recv_str,len, MPI_CHAR, i, 1,MPI_COMM_WORLD, &status);

sprintf(str_exp, "%lu", exp);
sprintf(recv_str + strlen(recv_str), deli);
sprintf(recv_str + strlen(recv_str),str_exp);


retVal = mpf_set_str(pi_ret, recv_str, 10);
//printf("string = %s \n", recv_str);
//printf("\nvalid? %d length %d\n", retVal, len);
//printf("str_exp = %s \n", str_exp);
mpf_add(pi, pi, pi_ret);
//printf("\nsize of %lu \n", strlen(recv_str));

}

最佳答案

这样做:

char * recv_str = malloc(PRECISION * sizeof(*recv_str)); /* Make sure PRECISION is large enough!!! */
...
char str_exp[32] = ""; /* Make it's large enough to hold the decimal representaion of a long. */
char * deli = "@";

if (NULL == recv_str)
{
perror("malloc() failed for recv_str");
assert(1);
}

for(i=1; i<= size - 1 ; i++)
{
strcpy(recv_str, ""); /* Reset the "string" to "empty" before each iteration! */

...

sprintf(str_exp, "%ld", exp);

assert(sizeof(recv_str) <= (strlen(recv_str) + strlen(deli)));
strcat(recv_str, deli);

assert(sizeof(recv_str) <= (strlen(recv_str) + strlen(str_exp)));
strcat(recv_str, str_exp);

...
}

free(recv_str);

更新:

因为它表明通过执行将 recv_str 初始化为 0-length

strcpy(recv_str, "");

没有解决问题,因为它很可能只是将“字符串”的第 1st 字节设置为 NUL/'\0',需要采取更激进的方法来清除带有 0 的整个“字符串”,方法是:

memset(recv_str, 0, PRECISION * sizeof(*recv_str));

关于c - Sprintf 连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com