скопировать выделенный массив символов в "обычный" массив символов - PullRequest
0 голосов
/ 08 февраля 2012

Скажите, пожалуйста, как правильно копировать выделенный массив символов в "обычный" массив символов? Я попытался сделать следующее, но это не удалось:

char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work

Ответы [ 5 ]

1 голос
/ 08 февраля 2012

strcpy - это функция, которая копирует строку.

Строка - это последовательность символов, завершающаяся нулевым символом и включающая его.

 char *buf = malloc(BUFSIZ);

Этот malloc вызов выделяет массив BUFSIZ char, но это не строка. Для копирования массива используйте функцию memcpy:

memcpy(temp, buf, BUFSIZ);

Если ваш массив содержит строку (последовательность символов, оканчивающихся нулевым символом), вы можете использовать strcpy для ее копирования.

1 голос
/ 08 февраля 2012

Перво-наперво, вы не должны приводить возвращаемое значение malloc (в любом случае в C), поскольку оно может скрывать ошибки.

Во-вторых, вам никогда не нужно умножать на sizeof(char) поскольку он всегда гарантированно равен единице - это засоряет ваш код.

И, что касается самого вопроса, вы можете использовать:

memcpy (temp, buff, BUFFSZ);

, чтобы скопировать весь массив символов.

Я предполагаю, что это то, что вам нужно, потому что вы не упоминаете об обработке "строк" C, только массив символов.

Если вы действительно если обрабатывает строки C, strcpy будет нормально работать в этом случае, при условии:

  • у вас есть место в конце буфера для завершающего нулевого байта;и
  • вы на самом деле вставили туда нулевой байт.

Например, этот небольшой фрагмент отлично работает:

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

int main (void) {
    // Two buffers.

    char buff1[4];
    char *buff2 = malloc (4);
    if (buff2 == NULL) {
        puts ("No memory!");
        return 1;
    }

    // Populate first buffer.

    buff2[0] = 'p';
    buff2[1] = 'a';
    buff2[2] = 'x';
    buff2[3] = '\0';

    // Transfer and print.

    strcpy (buff1, buff2);
    puts (buff1);

    // Free and exit.

    free (buff2);
    return 0;
}
1 голос
/ 08 февраля 2012

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

Если вы заполнили его завершенной строкой, тогда strcpy должно работать; если это не так, пожалуйста, дайте больше информации о том, как это «не работает».

Если вам не нужна завершенная строка, используйте memcpy:

memcpy(temp, buf, BUFSIZ);

Обратите внимание, что нет необходимости умножать на sizeof(char), так как это 1 по определению.

Если вы на самом деле пишете на C ++, то вы, вероятно, захотите использовать std::vector или std::string вместо того, чтобы возиться с необработанной памятью.

1 голос
/ 08 февраля 2012

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

strncpy(temp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string

Если это тоже не помогает, возможно, просто используйте memcpy()

memcpy(tmp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string
0 голосов
/ 08 февраля 2012

В вашем buf нет завершающего символа NUL. Вы должны обязательно сделать buf[last_actually_used_char+1] = '\0';. Это означает, что buf должен быть на один символ больше данных, которые вы хотите сохранить.

Это необходимо, поскольку strcpy находит длину копируемой информации путем поиска завершающего NUL.

Я настоятельно рекомендую использовать более безопасный strncpy или, если вы просто хотите скопировать данные (без '\0' необходимости), быстрее и безопаснее memcpy.

...