2010-08-07 5 views
1

Я написал функцию для реализации тетсруЧто случилось с моей memcpy?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <iostream> 
char *memcpy(char *dest,char *src,int n){ 

    char *ch=dest; 
    while (n--) 
     *ch++=*src++; 
    return dest; 
} 

int main(){ 

    char *src="georgia"; 
    int n=strlen(src); 
    char *dest=new char[n]; 
    std::cout<<*memcpy(dest,src,n)<<std::endl; 
    return 0; 
} 

Но он печатает только один g. Зачем?

+2

Не нужно копировать 'dest' в' ch', просто используйте его так же, как вы используете 'n'. Строки в C++ должны указывать на 'const char *', поэтому: 'const char * src =" georgia ";'. Длина строки не может быть отрицательной, и поэтому результат 'strlen' является неподписанным типом, а именно' size_t'. Поэтому не используйте 'int n', а' size_t n'. (Это также относится к количеству копируемых байтов, отрицательный - бессмысленному, используйте подписанный тип.) Никогда не выполняйте ручное распределение! Вы утечка 'dest'; используйте «std :: vector» вместо динамических массивов, поэтому вы никогда не сможете просочиться. В будущем выньте посторонние пробелы. :) – GManNickG

+2

@GMan: Если OP хочет вернуть 'dest', он не может его модифицировать (отсюда и необходимость' ch'). Кроме этого я согласен на 100%. –

+0

@ Джеймс: Ну держи меня. Удерживайте 'ch'. :) – GManNickG

ответ

13

Потому что вы печатаете один символ.

std::cout<<*memcpy(dest,src,n)<<std::endl; 

Этот разыменовывает буфер назначения (*memcpy) и, следовательно, возвращает первый символ строки (который является g). Вы должны быть хорошо использовать это:

std::cout << memcpy(dest, src, n) << std::endl; 

Кроме того, это еще не сработает: вы должны включать NULL символ завершающего вашей строки в копии, но strlen исключает его из длины строки; поэтому в вашем буфере отсутствует 1 символ. Вам нужно добавить 1 к n, чтобы сбалансировать его, и все должно быть хорошо.

int n = strlen(src) + 1; 
2

Вы разыскиваете символ char *, который является символом. Это будет первый символ, g.

3

Ничего плохого в функции memcpy, но у вас есть операция * на результат. Если мы нарушаем линию для печати вниз это ...

char * result = memcpy(dest,src,n); 
std::cout << *result << std::endl; 

Вы действительно хотите ...

std::cout << memcpy(dest,src,n) << std::endl; 
3

Ваш memcpy() возвращает указатель на char. В строке

std::cout<<*memcpy(dest,src,n)<<std::endl; 

вас разыменования указателя (используется оператор *) настолько эффективно, вы посылаете один char (один Возвращаемое значение указывает на) к потоку.

В вашем коде есть ошибка. strlen возвращает количество символов в буквальном «georgia», но с конечным нулевым символом. Вы должны увеличить n на один, выделить соответствующее хранилище для dest и скопировать также завершающий нулевой символ.

Смежные вопросы