2015-02-24 3 views
1

Я хочу написать функцию для преобразования массива п удваивается в строку, шоу-функции, что-то вроде:Отображение массива двойников

struct vec { uint64_t n; double *x; }; 

char *show(struct vec *v) {...} 

Обратите внимание, что я не хочу, чтобы напечатать их, только сериализация в строку.

Как это сделать в C?

+8

'sprintf' их в строку, один за другим? В зависимости от ваших требований к формату вы можете использовать формат с фиксированным количеством символов на элемент, что сделает управление памятью тривиальным. –

+2

Как вы хотите отделить значения в строке? Пространства, запятые, запятая, что-то еще? Это хорошая идея, чтобы указать такие детали. Если вы еще не подумали о таких вещах, узнайте, что вам это нужно. –

+0

Я просто хочу отделить значения пробелами. sprintf не кажется хорошей идеей, потому что я хочу показать все значения возможного длинного массива, и я хочу вызвать show с массивами разных размеров. – felipez

ответ

0

Вы можете сделать что-то вроде этого:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

#define MAX_DOUBLE_LENGTH 15 

typedef struct 
{ 
    size_t n; 
    double* x; 
} DoubleArray; 


int ShowArray(const DoubleArray* const doubleArrayPtr, char** const resultStringPtr) 
{ 
    int errorCode = 0; 

    char* tempStr = NULL; 

    char str[MAX_DOUBLE_LENGTH + 2]; /* 1 for trailing space and 1 for null-terminator */ 

    size_t N = 0; 
    size_t i = 0; 

    if (doubleArrayPtr == NULL || resultStringPtr == NULL) 
    { 
    errorCode = 1; 
    } 
    else 
    { 
    if (doubleArrayPtr->n != 0) 
    { 
     /* 
     calculating max string length from: 

     str = <double01> <space> <double02> <space> <double03> <null-terminator> 
     ex.: str = '3.25 4.75 0.01 5.678\0' 
     */ 
     N = doubleArrayPtr->n * MAX_DOUBLE_LENGTH + doubleArrayPtr->n; 

     tempStr = malloc(N * sizeof(*tempStr)); 

     if (tempStr == NULL) 
     { 
     errorCode = 1; 
     } 
     else 
     { 
     memset(tempStr, 0, N * sizeof(*tempStr)); 

     for(i = 0; i < doubleArrayPtr->n; i++) 
     { 
      sprintf(str, "%.6f ", doubleArrayPtr->x[i]); 
      strcat(tempStr, str); 
     } 
     tempStr[strlen(tempStr) - 1] = '\0'; 

     /* string formed -- allocating buffer for result */ 
     (*resultStringPtr) = malloc((strlen(tempStr) + 1) * sizeof(**resultStringPtr)); 
     if ((*resultStringPtr) == NULL) 
     { 
      errorCode = 1; 
     } 
     else 
     { 
      /* exporting result */ 
      memcpy((*resultStringPtr), tempStr, strlen(tempStr) * sizeof(*tempStr)); 
      (*resultStringPtr)[strlen(tempStr)] = '\0'; 
     } 
     } 
     free(tempStr); 
     tempStr = NULL; 
    } 
    } 

    return errorCode; 
} 

int main(void) 
{ 
    /* test code part */ 
    DoubleArray d; 

    char* s = NULL; 

    size_t i = 0; 

    srand(time(NULL)); 

    d.n = rand() % 21; 

    d.x = malloc(d.n * sizeof(*d.x)); 

    for(i = 0; i < d.n; i++) 
    { 
    d.x[i] = (rand() % 99999)/100.0; 
    printf("[%d] = %f\n", i, d.x[i]); 
    } 

    ShowArray(&d, &s); 
    printf("str = '%s'\n", s); 

    free(d.x); 
    free(s); 
    return 0; 
} 
Смежные вопросы