Sprintf в строку
У меня есть строка, которую мне нужно объединить некоторые данные в конце. Моя проблема в том, что каждый раз, когда цикл вращается, я получаю данные предыдущего цикла в конце моей строки. например, данные
Итерация 1-го цикла 1234@3 итерация 2-го цикла 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));
}
1 ответ
Решение
Сделай это так:
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
длина, делая
strcpy(recv_str, "");
не решил проблему, так как он, скорее всего, только устанавливает 1-й байт "строки" в NUL
/'\0'
, более радикальный подход должен быть предпринят, чтобы очистить всю "строку" с 0
с помощью:
memset(recv_str, 0, PRECISION * sizeof(*recv_str));