Как соединить два символа * в C? - PullRequest
9 голосов
/ 17 марта 2012

Я получаю буфер char *, длина которого равна 10. Но я хочу объединить весь контент в моей структуре с переменной char *.

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
}

Примерно так:

  real[i].buffer += buffer;

Как я могу сделать это в C?

Ответы [ 3 ]

11 голосов
/ 17 марта 2012

В общем, сделайте следующее (настройте и добавьте проверку ошибок, как считаете нужным)

// 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 голосов
/ 17 марта 2012

Вы можете использовать strcat(3) для объединения строк. Убедитесь, что у вас достаточно места в пункте назначения!

Обратите внимание, что простой вызов strcat() несколько раз приведет к алгоритму Шлемиэля Художника . Отслеживание общей длины в вашей структуре (или в другом месте, если вы предпочитаете) поможет вам с этим.

0 голосов
/ 17 марта 2012

Мне не ясно. Вы хотите:

  • для объединения каждого из 10 получаемых символьных буферов в один массив, на который указывает один real[0].buffer или
  • хотите ли вы, чтобы на каждый 10-символьный буфер указывал различный real[i].buffer или
  • что-то еще?

Вам потребуется выделить достаточно места для копии буфера:

#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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...