tengo algunos problemas con un simple función de copia:

void string_copy(char *from, char *to) {

    while ((*to++ = *from++) != '
void string_copy(char *from, char *to) {
while ((*to++ = *from++) != '\0')
;
}
'
) ; }

Lleva dos punteros a cadenas como parámetros, se ve bien pero cuando lo intento tengo este error:

Segmentation fault: 11

Este es el código completo:

#include <stdio.h>

void string_copy(char *from, char *to);

int main() {
    char *from = "Hallo world!";
    char *to;
    string_copy(from,to);
    return 0;
}

Gracias a todos

InformationsquelleAutor Francesco | 2016-02-07

3 Comentarios

  1. 7

    Tu problema con el destino de la copia: es un char* que no se ha inicializado. Cuando intenta copiar una cadena C en ella, se obtiene un comportamiento indefinido.

    Usted necesita para inicializar el puntero

    char *to = malloc(100);

    o hacer una matriz de caracteres lugar:

    char to[100];

    Si usted decide ir con malloc, usted necesita llamar a free(to) una vez que haya terminado con la copia de la cadena.

  2. 3

    Necesita asignar memoria para to. Algo así como:

    char *to = malloc(strlen(from) + 1);

    No olvides liberar la memoria asignada con un free(to) llamada cuando ya no la necesite.

    • malloc tamaño se ve bien – tal vez añadir una nota a free después de string_copy
    • Buen punto. Añadido. Gracias.
    • hola, gracias por el + 1
    • strlen valor de retorno no se incluyen las caracter NUL. Así que +1 es para asegurarse de que no es un byte para almacenar la NUL, la cual es necesaria para formar una cadena válida en C.
  3. 1

    En este programa

    #include <stdio.h>
    
    void string_copy(char *from, char *to);
    
    int main() {
        char *from = "Hallo world!";
        char *to;
        string_copy(from,to);
        return 0;
    }

    puntero to tiene valor indeterminado. Como resultado, el programa tiene un comportamiento indefinido.

    También la función de string_copy tiene una interfaz equivocada. Se dice que no se garantiza que la cadena apuntada por from no será cambiado.

    También hay una convención común en la C que las funciones que se ocupan de las cadenas suelen devolver puntero a la cadena de destino.

    La función debe ser declarada como

    char * string_copy( const char *from, char *to );
    ^^^^^^              ^^^^^

    Su definición podría parecer

    char * string_copy( const char *from, char *to ) 
    {
        for ( char *p = to; ( *p = *from ) != '
    char * string_copy( const char *from, char *to ) 
    {
    for ( char *p = to; ( *p = *from ) != '\0'; ++p, ++from )
    {
    ;
    }
    return to;
    }
    '
    ; ++p, ++from ) { ; } return to; }

    Y el programa podría parecer

    #include <stdio.h>
    #include <string.h>
    #include >stdlib.h>
    
    char * string_copy( const char *from, char *to );
    
    int main( void ) 
    {
        char *from = "Hallo world!";
        char *to;
    
        to = malloc( strlen( from ) + 1 );
    
        puts( string_copy( from, to ) );
    
        free( to );
    
        return 0;
    }
    
    char * string_copy( const char *from, char *to ) 
    {
        for ( char *p = to; ( *p = *from ) != '
    #include <stdio.h>
    #include <string.h>
    #include >stdlib.h>
    char * string_copy( const char *from, char *to );
    int main( void ) 
    {
    char *from = "Hallo world!";
    char *to;
    to = malloc( strlen( from ) + 1 );
    puts( string_copy( from, to ) );
    free( to );
    return 0;
    }
    char * string_copy( const char *from, char *to ) 
    {
    for ( char *p = to; ( *p = *from ) != '\0'; ++p, ++from )
    {
    ;
    }
    return to;
    }
    '
    ; ++p, ++from ) { ; } return to; }

    Tener en cuenta que usted no podrá utilizar el puntero to declarado como

        char *from = "Hallo world!";
        char *to   = "Hello everybody!";

    en la función porque los literales de cadena son inmutables.

    • Hola me tomó el código para string_copy de «La c de programación: el lenguaje» de Brian de ecc. No entiendo por qué usted necesita const en la firma de string_copy. Gracias
    • Si no hay ningún calificador const, a continuación, el cliente de la función no se puede estar seguro de que la cadena apuntada por el puntero de no ser cambiado dentro de la función.
    • Oh, sí, tienes razón 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here