C - прочитать строку из буфера определенного размера - PullRequest
4 голосов
/ 18 июля 2010

У меня есть char buf [x] , int s и void * data .

Я хочу записать строку размером с в данные из buf .

Как мне это сделать?

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 18 июля 2010

Предполагая, что

  • под «строкой» вы подразумеваете строку с нулевым символом в конце, как обычно подразумевается в C;
  • вы еще не выделили память в data;
  • вы уже знаете, что s <= x </li>

Сначала вам нужно выделить память в data. Не забывайте комнату для байта 0 в конце строки.

data = malloc(s+1);
if (data == NULL) {
    ... /*out-of-memory handler*/
}

Если malloc успешно, вы можете скопировать байты.

EDIT

Лучшая функция для работы, как указано в caf, - это strncat. (Полностью переносимая, будучи частью C89.) Она добавляется к строке назначения, поэтому организуйте пункт назначения заранее быть пустой строкой:

*(char*)data = 0;
strncat(data, buf, s);

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

  • Если у вас есть strlcpy (который не является стандартным C, но распространен в современных системах Unix; существуют общедоступные реализации, распространяющиеся вокруг):

    strlcpy(data, buf, s+1);
    
  • Если вы знаете, что в исходной строке есть хотя бы s символов, вы можете использовать memcpy:

    memcpy(data, buf, s);
    

    ((char *) data) [s + 1] = 0;

  • В противном случае вы можете сначала вычислить длину исходной строки:

    size_t bytes_to_copy = strlen(buf);
    if (bytes_to_copy > s) bytes_to_copy = s;
    memcpy(data, buf, bytes_to_copy);
    ((char*)data)[s+1] = 0;
    
  • Или вы можете использовать strncpy, хотя это неэффективно, если фактическая длина исходной строки намного меньше, чем s:

    strncpy(data, buf, s);
    ((char*)data)[s+1] = 0;
    
3 голосов
/ 18 июля 2010

Если data не выделено:

char buf[] = "mybuffer";
void *data = malloc(strlen(buf)+1);
strcpy((char*)data,buf);

На самом деле, если данные действительно должны быть определены, вы также можете сделать

char buf[] = "mybuffer";
void *data= (void*)strdup(buf);
2 голосов
/ 18 июля 2010
int n = MIN((x - 1), s);
char *bp = buf;
char *dp = (char *)data;
while (n--) {
  *bp++ = *dp++;
}
*dp = '\0';
2 голосов
/ 18 июля 2010
data = malloc(s);
strcpy((char*)data,buf);
free(data);
2 голосов
/ 18 июля 2010
memcpy(data, buf, s);

Предполагается, что у вас достаточно места в данных (и в буфере).

В зависимости от того, что вы делаете (вы не говорите, но вы говорите, что копируете строки), вы можете добавить нуль в конец вашей недавно скопированной строки, если вы уже не копировали ноль в баффе, и вы собираетесь использовать данные в функции, которая ожидает строки.

...