Нужна помощь в копировании буфера с использованием memcpy - PullRequest
0 голосов
/ 20 июля 2011

в следующем коде, когда я использую fwrite, это дает правильное значение o / p.Пока memcpy не работает.

typedef struct
{
  char *p1;
  char *p2;
} node;
char s[] = "hello";
char t[] =" there";
node t1, t2;
char str;
FILE op_f;

t1.p1 = malloc(sizeof(strlen(s));
t1.p2 = malloc(sizeof(strlen(s));

t2.p1 = malloc(sizeof(strlen(s));
t2.p2 = malloc(sizeof(strlen(s));

t1.p1 = s;
t1.p2 = t;
copy(&t1,&t2);

str = malloc(sizeof(strlen(s) + strlen(t));
/* gives o/p hello there */
fwrite(t2.p1,1,strlen(s),op_f);
fwrite(t2.p1,2,strlen(s),op_f);

/* gives o/p there */
memcpy(str,t2.p1,strlen(s));
memcpy(str,t2.p2,strlen(s));

Есть ли способ скопировать буфер в str ??

PS: приведенный выше код только для справки, а не для фактического кода

Ответы [ 5 ]

2 голосов
/ 20 июля 2011

Строки, хранящиеся в массивах символов, требуют один дополнительный байт для терминатора.При вычислении размера вам нужно добавить 1 дополнительную позицию:

t1.p1 = malloc(strlen(s) + 1); 

Этот код

t1.p1 = s; 

не копирует текст из s в p1, а устанавливает p1 для указания на ту же строку, что и s.

Эта часть

str = malloc(strlen(s) + strlen(t));  

не работает, поскольку str - это один char, а не char*.Вы можете попробовать

char* str = malloc(strlen(s) + strlen(t) + 1);  

Если вы действительно хотите, чтобы это было помечено как C ++, вам следует вместо этого использовать std::string.Он обрабатывает все эти детали.

2 голосов
/ 20 июля 2011

Вы должны объявить str как массив символов, а не один символ:

char str[500];

когда str объявлен как массив, str является указателем (на первый элемент массива). А в вашем коде - str был символом, а не указателем. Memcpy нужны указатели в качестве первого и второго аргумента

Также используйте malloc для строк без sizeof:

 t1.p2 = malloc(strlen(s)+1);

Кроме того, fwrite используется неправильно, потому что op_f не инициализируется с fopen как:

 op_f = fopen("filename.txt", "w");
1 голос
/ 20 июля 2011
/* These are static.  You SHOULD NOT write to either s or t! */
char s[] = "hello";
char t[] =" there";

typedef struct
{
  char *p1;
  char *p2;
} node;
node t1, t2;

/* I think you wanted "*str" here... */
char *str;

/* You definitely want "length of string + 1" here */
t1.p1 = malloc(strlen(s) + 1);
strcpy (t1.p1, s);
...
/* strcpy() and strcat() might be applicable here */
/* strncpy() and strncpy() might be even better - it depends... */
str = malloc(strlen(s)+1 + strlen(t)+1);
strcpy (str, s);
strcat (str, t);
1 голос
/ 20 июля 2011

во-первых, вы должны использовать strcpy при работе со строками (если они завершены нулем), поскольку в вашем коде в настоящее время есть ошибка, которая скрыта из-за того, что 'hello' и 'there' имеют одинаковую длину, чтобыисправить это, что вы должны делать (то же самое относится к malloc вызовам):

fwrite(t2.p1,sizeof(char),strlen(t2.p1),op_f);
fwrite(t2.p2,sizeof(char),strlen(t2.p2),op_f); //was also a bug here, you used p1 instead of p2 and the size of each element should have been 1

/* gives o/p there */
memcpy(str,t2.p1,strlen(t2.p1));
memcpy(str,t2.p2,strlen(t2.p2));

Ваша настоящая проблема возникает из-за того, что memcpy не увеличивает указатели, следовательно, вы должны делать:

strcpy(str,t2.p1);
strcat(str,t2.p2);

или если вы действительно хотите использовать memcpy:

memcpy(str,t2.p1,strlen(t2.p1));
memcpy(str + strlen(t2.p1) - 1,t2.p2,strlen(t2.p2));

наконец, ваши malloc указатели возврата, а не char, поэтому str должно быть char*.

1 голос
/ 20 июля 2011

Я только что заметил, что вы используете 'char str' вместо 'char * str', поэтому результат malloc (который является указателем на строку) неправильно хранится в переменной.

Также, когда вы используете malloc, вам нужно вычислить размер следующим образом: strlen (s) + strlen (t) + 1. Дополнительный байт для завершающего символа NULL.И вам не нужно использовать sizeof там.Оператор finally будет выглядеть так:

str = malloc(strlen(s) + strlen(t) + 1);
...