2012-03-17 42 views
8

Tôi nhận được bộ đệm char * có chiều dài là 10. Nhưng tôi muốn concat toàn bộ nội dung trong cấu trúc của tôi có biến char *.Làm thế nào để concat hai char * trong 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 
} 

Something như thế này:

real[i].buffer += buffer; 

Làm thế nào tôi có thể làm điều này trong C?

Trả lời

10

Nói chung, làm như sau (điều chỉnh và bổ sung kiểm tra lỗi như bạn thấy phù hợp)

// 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

Bạn có thể sử dụng strcat(3) để ghép các chuỗi. Hãy chắc chắn rằng bạn đã phân bổ đủ không gian tại điểm đến!

Lưu ý rằng chỉ cần gọi strcat() một loạt thời gian sẽ dẫn đến Schlemiel the Painter's algorithm. Theo dõi tổng chiều dài trong cấu trúc của bạn (hoặc ở nơi khác, nếu bạn thích) sẽ giúp bạn với điều đó.

+0

Luôn sử dụng 'strncat' (cũng được bao gồm trong liên kết ở trên) và không phải' strcat'. – pickypg

+3

Luôn luôn? Điều đó có vẻ hơi nặng tay. "Hãy cẩn thận" luôn luôn là lời khuyên tốt, mặc dù - Tôi sẽ đồng ý với điều đó. Đây là câu hỏi và một số câu trả lời liên quan đến thời điểm sử dụng: http://stackoverflow.com/questions/6491038/strcat-vs-strncat-when-should-which-function-be-used –

+2

Nếu bạn không biết tại sao bạn sử dụng 'strcat', đó là vì hai bộ đệm được bảo đảm được xác định trước, sau đó bạn nên luôn sử dụng' strncat'. Một người nào đó bắt đầu trong C sẽ luôn tốt hơn bằng cách sử dụng 'strncat' trên' strcat' đơn giản chỉ vì rủi ro không đáng để thưởng không đáng kể. Xem xét những lợi ích thực sự là gì, tôi thậm chí sẽ cho rằng bạn sẽ không bao giờ thực sự được hưởng lợi từ nó trừ khi bạn đang viết một cái gì đó cực kỳ thấp và kiểm tra trước khi điều kiện tiên quyết đã được thực hiện. – pickypg

0

Tôi không rõ ràng. Bạn có muốn:

  • để nối mỗi một trong những bộ đệm 10 nhân vật bạn nhận được vào một mảng, chỉ vào người một real[0].buffer, hoặc
  • nào bạn muốn mỗi bộ đệm 10 nhân vật được chỉ vào một khác nhau real[i].buffer hoặc
  • cái gì khác?

Bạn sẽ cần phải phân bổ đủ không gian cho các bản sao của bộ đệm:

#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); 
Các vấn đề liên quan