2012-03-17 21 views
8

Recibo un búfer de char * que tienen la longitud de 10. Pero quiero concat la totalidad del contenido de mi estructura que tiene una variable char *.Cómo concat dos char * en C?

typedef struct{ 
    char *buffer; 
    //.. 

}file_entry; 

file_entry real[128]; 

int fs_write(char *buffer, int size, int file) { 
    //every time this function is called buffer have 10 of lenght only 
    // I want to concat the whole text in my char* in my struct 
} 

Algo como esto:

real[i].buffer += buffer; 

¿Cómo puedo hacer esto en C?

Respuesta

10

En general, hacer lo siguiente (ajustar y añadir la comprobación de errores como mejor le parezca)

// real[i].buffer += buffer; 

    // Determine new size 
    int newSize = strlen(real[i].buffer) + strlen(buffer) + 1; 

    // Allocate new buffer 
    char * newBuffer = (char *)malloc(newSize); 

    // do the copy and concat 
    strcpy(newBuffer,real[i].buffer); 
    strcat(newBuffer,buffer); // or strncat 

    // release old buffer 
    free(real[i].buffer); 

    // store new pointer 
    real[i].buffer = newBuffer; 
4

Puede usar strcat(3) para concatenar cadenas. ¡Asegúrate de haber asignado suficiente espacio en el destino!

Tenga en cuenta que simplemente llamando al strcat() un montón de veces dará como resultado un Schlemiel the Painter's algorithm. Hacer un seguimiento de la longitud total en su estructura (o en otro lugar, si lo prefiere) le ayudará con eso.

+0

Siempre use 'strncat' (también incluido en el enlace de arriba) y no' strcat'. – pickypg

+3

siempre? Eso parece un poco torpe. "Ten cuidado" siempre es un buen consejo, estoy de acuerdo con eso. Aquí hay una pregunta y algunas respuestas sobre cuándo usar cada una: http://stackoverflow.com/questions/6491038/strcat-vs-strncat-when-should-which-function-be -used –

+2

Si no sabes por qué eres usando 'strcat', que se debe a que los dos búferes están bajo garantías predeterminadas, entonces siempre debe usar' strncat'. Alguien que comienza en C siempre estará mejor usando 'strncat' que' strcat' simplemente porque el riesgo no vale la pena la recompensa imperceptible. Teniendo en cuenta cuál es en realidad el beneficio, incluso diría que nunca se beneficiará realmente a menos que esté escribiendo algo de un nivel increíblemente bajo y ya se hayan realizado los controles de requisitos previos. – pickypg

0

No estoy seguro. ¿Quieres:

  • para concatenar cada una de las 10 memorias intermedias de caracteres que recibe en una matriz, señalado por uno real[0].buffer o
  • qué quiere cada búfer de 10 caracteres que se señaló por una diferente real[i].buffer , o
  • algo más?

Usted tendrá que asignar suficiente espacio para la copia de la memoria intermedia:

#include <stdlib.h> 
//... 
int size = 10+1; // need to allocate enough space for a terminating '\0' 
char* buff = (char *)malloc(size); 
if (buff == NULL) { 
    fprintf(stderr, "Error: Failed to allocate %d bytes in file: %s, line %d\n, 
        size, __FILE__, __LINE__); 
    exit(1); 
} 
buff[0] = '\0'; // terminate the string so that strcat can work, if needed 
//... 
real[i].buffer = buff; // now buffer points at some space 
//... 
strncpy(real[i].buffer, buffer, size-1);