memcpy - Copiando caracteres de uma string para outra

  • memcpy: char* memcpy( char *dest, char *src, int n );

Copia os 'count' primeiros caracteres da string 'src' e coloca nas primeiras 'count' da string 'dest'.

Como implementar a função memcpy()

Primeiro recebemos do usuário duas strings: a 'orig', que é a string de origem, e a 'dest', que é a string de destino.

Ou seja, vamos pegar os 'n' primeiros caracteres da string de origem, e colocar nas 'n' primeiras posições da string de destino.

Como estamos passando strings (vetores), estamos passando seu endereço.
Logo, essa função vai alterar a string de destino.

Para fazer isso, basta fazer com que a string dest receba os 'n' primeiros caracteres (da posição 0 até a n-1) da string orig.

Veja como ficou o código C para implementar essa função:


char *memcpy(char *dest, char *orig, int n)
{
    int i;

    for(i=0 ; i < n ; i++)
        dest[i] = orig[i];

    return dest;
}

2 comentários:

  1. Olá, bem eu tenho uma pergunta(é bem provável que seja uma pergunta idiota) mas vamos lá; por que no código acima não foi colocado o caractere delimitador "\0'.

    ResponderExcluir
  2. Sem o '\n` minha função estava a imprimir o restante dos caracteres como símbolos.
    Estou usando o compilador "Móvel c" no Android. Segue meu código.
    #include
    #include
    #include
    #define MAX 30

    int _strlen(char * str);
    char *_strcpy(char * dest, char * orig);
    char *_memcpy(char * dest, char * orig, int);
    void LimparLixo();

    int main()
    {
    int op, p, qtd;
    char *palavra[MAX], *destino[MAX];

    do
    {
    printf("1: strlen()\n");
    printf("2: strcpy()\n");
    printf("3: memcpy()\n");
    scanf("%d",&op);

    system("cls");
    switch(op)
    {
    case 1:
    printf("strlen()\n");//conta caracteres de uma string
    //LimparLixo();//tentei e deu certo antes de usar a funcao switch,,case
    //fgets(palavra, sizeof(palavra) -1, stdin);//conta tambem o buffer \n do teclado
    gets(palavra);
    //fflush(stdin);//nao funciona com funcao fgets()
    p = _strlen(palavra);
    printf("Tamanho = %d", p);
    break;

    case 2:
    printf("strcpy()\n");//copia uma string de uma variavel para outra
    fgets(palavra, sizeof(palavra), stdin);
    _strcpy(destino, palavra);
    //printf("Palavra [%s]", destino); // junto da funcao fgets, contabilliza o buffer '\n'
    puts(destino);
    //fflush(stdin);
    break;

    case 3:
    printf("memcpy()\n");//copia quantidade de caracteres de uma string para a variavel destino
    //printf("Quantos caracteres copiar?\t");
    //fgets(palavra, sizeof(palavra), stdin);
    gets(palavra);
    //scanf("%f", palavra);
    qtd = 3;
    //scanf("%d", &qtd);
    _memcpy(destino, palavra, qtd);
    printf("Palavra [%s]", destino);
    //puts(destino);
    break;

    default:
    printf("Erro, digite 'sair'");

    }
    }while(op == 'sair');
    return 0;
    }

    int _strlen(char * str)
    {
    int cont = 0;
    while(str[cont] != '\0')
    cont++;
    return cont;
    }

    char *_strcpy(char * dest, char * orig)
    {
    int i;
    for(i = 0 ; i < _strlen(orig) ; i++ )
    dest[i] = orig[i];
    dest[i] = '\0';
    return dest;
    }

    char *_memcpy(char * dest, char * orig, int n)
    {
    int i;
    for(i = 0; i < n ; i++)
    dest[i] = orig[i];

    dest[i] = '\0';// estava a imprimir o restante dos caracteres restantes como simbolos
    return dest;
    }

    void LimparLixo()
    {
    int ch;
    do
    {
    ch = getchar();
    }while(ch != EOF && ch != '\n');
    clearerr(stdin);
    }

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.