Bloque 7.4: Strings Dinamicos y Funcion exit

แชร์
ฝัง
  • เผยแพร่เมื่อ 11 ธ.ค. 2024

ความคิดเห็น • 38

  • @agustinlyon8173
    @agustinlyon8173 3 ปีที่แล้ว

    Me ha encantado el video, muy bueno. Todas estas cosillas me van a ayudar para mi proyecto de programacion 2

  • @emilioortega9487
    @emilioortega9487 7 ปีที่แล้ว

    a los 6:15 por que dices "no podria usar fgets y pasarselo directamente a la variable dinamica, seria mas complicado", hay algun video donde se haga pasando directo ?

  • @dek094
    @dek094 10 ปีที่แล้ว

    en qué vídeo explicas la función cambio? gracias

    • @albertuco95
      @albertuco95 5 ปีที่แล้ว

      más o menos en casi todos los que utiliza la funcion fgets

  • @marktulsoto8685
    @marktulsoto8685 3 ปีที่แล้ว

    Como funcionaria strcat( ) o strcpy( ) con strings dinamicos cuando se exede el temaño inicial? Osea, automaticamente el puntero pasa a apuntar a un nuevo espacio con tamaño mayor y serian copiados los caracteres? Y si es esi, que pasa con la memoria anterior, es liberada automaticamente ?

    • @alexmasxmenosesmenos4441
      @alexmasxmenosesmenos4441 ปีที่แล้ว

      con strcat, si en un string tienes "hola" y en el segundo string tienes "mundo", coges lo que hay en el segundo strings y lo "pegas" en el primer strings, quedándote "hola mundo"
      con strcpy, simplemente copias lo que hay en un string en otro string.
      Mas o menos creo que es esto. :)

  • @jairzinhosantosfajardo9731
    @jairzinhosantosfajardo9731 9 ปีที่แล้ว +4

    amigo en el devC++ 5.10 "NO" me da error al usar realloc , me compila todo bien
    aqui dejo mi codigo
    #include
    #include
    #include
    typedef struct{
    char *nombre;
    char *autor;
    }libro;
    int main(){
    char aux[50];
    libro lib;

    printf("Ingresa un nombre para el libro : ");
    fflush(stdin);
    scanf("%[^
    ]",&aux);
    lib.nombre=(char*)realloc(lib.nombre,(strlen(aux)+1)*sizeof(char));
    if(lib.nombre==NULL){
    printf("No se a podido reservar la memoria requerida
    ");
    exit(1);
    }
    strcpy(lib.nombre,aux);
    printf("Ingresa un autor para el libro : ");
    fflush(stdin);
    scanf("%[^
    ]",&aux);
    lib.autor=(char*)realloc(lib.autor,(strlen(aux)+1)*sizeof(char));
    if(lib.autor==NULL){
    printf("No se a podido reservar la memoria requerida
    ");
    exit(1);
    }
    strcpy(lib.autor,aux);
    printf("
    El nombre y autor del libro son :
    ");
    printf("%s
    ",lib.nombre);
    printf("%s
    ",lib.autor);
    free(lib.autor);
    free(lib.nombre);
    return 0;
    }

    • @alansalmeron2359
      @alansalmeron2359 9 ปีที่แล้ว

      +Jairzinho Santos Fajardo A mi tambien me pasa lo mismo!!!!!y mi devC++ es el 5.11

    • @guillermotovar-sanchez5881
      @guillermotovar-sanchez5881 8 ปีที่แล้ว

      +Jairzinho Santos Fajardo a mí también me compila bien. Supongo que lo que pasa es que en la versión que mencionas ha de dar por default un valor y por eso es posible compilar. Algo así como si no pusieramos la librería stdlib.h Prueba con otro IDE o con una versión anterior, a ver si es lo mismo. Saludos!

  • @franciscofranceschi8280
    @franciscofranceschi8280 3 ปีที่แล้ว

    En el caso que nesecite un arreglo de estructuras como se haría de forma dinamica?

    • @EmpiezaAProgramar
      @EmpiezaAProgramar  3 ปีที่แล้ว +1

      Echale un ojo a todos los videos de la lista de reproduccion de C antes de preguntar, hay un video precisamente de eso!!
      th-cam.com/video/K1V0LzvM_34/w-d-xo.html&ab_channel=EmpiezaAProgramar

    • @franciscofranceschi8280
      @franciscofranceschi8280 3 ปีที่แล้ว

      @@EmpiezaAProgramar muchas gracias por responder

    • @EmpiezaAProgramar
      @EmpiezaAProgramar  3 ปีที่แล้ว +1

      @@franciscofranceschi8280 joder todo sea eso, dale las gracias a los que investigan contra el coronavirus :P

  • @sergiosanjose1131
    @sergiosanjose1131 3 ปีที่แล้ว

    por que no se puede utilizar la funcion free con la variable aux???

    • @marktulsoto8685
      @marktulsoto8685 3 ปีที่แล้ว

      Aux es un vector estatico, portanto es guarado en el Stack y "se libera automaticamente", ya los otros vectores donde usa free, es porque son vectores dinamicos, que son guardados en el Heap y no son liberados automaticamente. Recuerda: solo la memoria dinamica debe ser liberada explicitamente con free, la memoria estatica siempre es liberada automaticamente.

  • @themercury8250
    @themercury8250 10 ปีที่แล้ว

    una pregunta, en la linea:
    JDT.nombre = (char*)malloc((strlen(aux))*sizeof(char));
    me da este error al compilar:
    [Error] incompatible types when assigning to type 'char *[50]' from type 'char *'
    por que puede ser?

    • @pablopiedad90
      @pablopiedad90 7 ปีที่แล้ว

      JDT.nombre = (char*)malloc((strlen(aux)+1)*sizeof(char));
      Si pones esto entonces se asignar el espacio de memoria para una cadena y su '/0' famoso

  • @TheGocho28
    @TheGocho28 7 ปีที่แล้ว

    la funcion exit, me cierra el codigo completamente o me cierra la totalidad de la porcion de una funcion, es decir si la hubieramos metido en void cambio... se cierra esa funcion y me lanza al codigo main directamente o me cierra todo el programa??

    • @agustinlyon8173
      @agustinlyon8173 3 ปีที่แล้ว

      Estoy taaardiiiisimoooo, pero para el que me este leyendo y tenga la duda el exit() les cerrara todo el programa. Asi que sepan bien usarlo

  • @andersonloaiza9622
    @andersonloaiza9622 9 ปีที่แล้ว

    tengo una pequeña duda, con que fin utilizaste el temp en la funcion cambio, de antemano gracias

    • @EmpiezaAProgramar
      @EmpiezaAProgramar  9 ปีที่แล้ว +2

      anderson loaiza Como en todos los videos este no es diferente, todo lo que doy por hecho (como la funcion cambio) es porque ya esta explicado anteriormente, por lo que si no entiendes algo de la funcion lo ideal es que te vayas al video en cuestion (no recuerdo si sera del bloque 6 o 7) y te lo repases.
      De todas formas, si estas en este bloque, deberias de ser capaz de entender el codigo, repasate las rutas de escape o condiciones de parada que tambien se suelen llamar:
      th-cam.com/video/bRAthoxbVyA/w-d-xo.html
      Un saludo.

  • @pedrogarciaferrera3671
    @pedrogarciaferrera3671 7 ปีที่แล้ว

    Hola, genial video.
    Si uso exit en una función fuera del main, sale de la función en la que esté o de todo el programa?

    • @saulaxel
      @saulaxel 6 ปีที่แล้ว

      De todo el programa y regresa al proceso que mando a llamar a tu programa el código de ejecución que usaste como argumento.

  • @memero32xd
    @memero32xd 4 ปีที่แล้ว

    Por qué en el prototipo de las funciones al iniciar pasa el tamaño de aux como 100 en vez de 50?

    • @yuriantoniosalazarromero4764
      @yuriantoniosalazarromero4764 3 ปีที่แล้ว

      De acuerdo Bill Acosta es probable que se le haya olvidado actualizarlo, seguro lo copio de algún ejemplo anterior, lo mismo ocurre con la variable "i" en la función cambio se le olvido poner "i

  • @manueltorrealba7518
    @manueltorrealba7518 7 ปีที่แล้ว

    Tengo un pequeño problema, lo que pasa es que al momento de introducir los nombres me imprime un salto de línea extra. Este es mi código:
    //crear una estructura que represente un libro y usando los strings dinamicos
    #include
    #include
    #include
    typedef struct{
    char *nombre;
    char *autor;
    }libro;
    void cambio (char aux [50]);
    int main (){
    char aux [50];
    libro JDT;
    printf ("Introduce un nombre para el libro: ");
    fflush (stdin);
    fgets(aux,50,stdin);
    cambio (aux);
    JDT.nombre = (char*)malloc((strlen(aux)+1)*sizeof(char));
    if (JDT.nombre == NULL){
    printf ("No se ha podido reservar memoria.
    ");
    exit(1);
    }
    strcpy(JDT.nombre,aux);
    printf ("Introduce un autor para el libro: ");
    fflush (stdin);
    fgets(aux,50,stdin);
    cambio (aux);
    JDT.autor = (char*)malloc((strlen(aux)+1)*sizeof(char));
    if (JDT.autor == NULL){
    printf ("No se ha podido reservar memoria.
    ");
    exit(1);
    }
    strcpy(JDT.autor,aux);
    printf ("%s
    ",JDT.nombre);
    printf ("%s
    ",JDT.autor);
    free(JDT.autor);
    free(JDT.nombre);
    system ("pause");
    return 0;
    }
    void cambio (char aux [50]){
    int i, temp = 0;
    for (i = 0; i < 100 && temp == 0; i++){
    if (aux [i] == '
    '){
    aux [i] == '\0';
    temp = 1;
    }
    }
    }

  • @neonh3043
    @neonh3043 7 ปีที่แล้ว +4

    Esta forma de cambiar el
    por \0 me parece mejor:
    void espacio (char f[50]){
    int o;
    o=strlen(f);
    f[o-1]='\0';
    }

    • @srdonpitopocho1183
      @srdonpitopocho1183 5 ปีที่แล้ว

      buen aporte

    • @facundogallardo6122
      @facundogallardo6122 4 ปีที่แล้ว +2

      Creo que en el caso en el que el string que escribas tenga el mismo tamaño que el que le das para guardar estarías perdiendo la última letra ya que no tomaría el
      porque no tendría el espacio para ello.

  • @carlosdelgado4867
    @carlosdelgado4867 7 ปีที่แล้ว

    amigo no se puede descargar el pdf!!

  • @edkaem259
    @edkaem259 8 ปีที่แล้ว

    Hola, al parecer se puede usar malloc y calloc par el mismo objetivo, checken el código:
    #include
    #include
    #include
    int main(){
    int i;
    int N;
    int *vector;
    printf("Dame un valor para N: ");
    scanf("%i",&N);
    vector = (int*)calloc(N,sizeof(int));
    if(vector == NULL) {
    printf("No se ha podido reservar la memoria.
    ");
    }
    else {
    for(i=0; i

    • @smith6540
      @smith6540 8 ปีที่แล้ว

      si solo que calloc inicializa el vector en 0 y el malloc no

  • @مجهولمجهول-ص5ه8ش
    @مجهولمجهول-ص5ه8ش 4 ปีที่แล้ว

    Puedes usar scanf("%[^
    ]s", variableString) ;
    Para capturar texto con espacios y sin '
    '
    Para ahorrate el cambio '
    ' por '\0'

    • @agustinlyon8173
      @agustinlyon8173 3 ปีที่แล้ว

      El dijo que capturar datos con el scanf era incorrecto.

    • @Jaredcito1204
      @Jaredcito1204 ปีที่แล้ว

      @@agustinlyon8173 no dijo que era incorrecto solo que con scanf no imprimia espacios pero con la sentencia que dijo se soluciona eso

    • @Jaredcito1204
      @Jaredcito1204 ปีที่แล้ว

      @@agustinlyon8173 Olvidalo, lo pobre y permite superar los espacios asignados, o sea accede a espacio de memoria que no se asigno

  • @HorckunHarotTutoriales
    @HorckunHarotTutoriales 7 ปีที่แล้ว

    // LIBROS MEDIANTE VECTORES DINÁMICOS#include
    #include
    #include #define p printf
    #define s scanftypedef struct {
    int paginas;
    int precio;
    int lleno;
    char *titulo;
    char *autor;
    }libro;libro libros[5];void vaciar();
    void cambiar(char palabras[]);
    void insertar();
    void buscar();int main() {
    vaciar();
    int opcion,i;
    do {
    do {
    p("Elige una opci%cn:
    ",162);
    p("=================

    ");
    p("[1] - A%cadir libro.
    ",164);
    p("[2] - Buscar libro.

    ");
    p("Opci%cn: ",162);
    fflush(stdin);
    s("%i",&opcion);
    p("
    ");
    switch(opcion) {
    case 1: {
    insertar();
    break;
    }
    case 2: {
    buscar();
    break;
    }
    }
    } while(opcion < 1 || opcion > 2);
    p("Elige una opci%cn:
    ",162);
    p("=================

    ");
    p("[1] - Continuar.
    ");
    p("[2] - Salir.

    ");
    p("Opci%cn: ",162);
    fflush(stdin);
    s("%i",&opcion);
    p("
    ");
    } while(opcion == 1);
    for(i = 0; i < 5; i++) {
    free(libros[i].autor);
    free(libros[i].titulo);
    }
    p("Visita: horckun.es/

    ");
    return 0;
    }
    void vaciar() {
    int i;
    for(i = 0; i < 5; i++) {
    libros[i].lleno = 0;
    p("%i/5 libros vacios...
    ",i+1);
    Sleep(1000);
    }
    p("

    ");
    p("%i libros vac%cos.

    ",i,161);
    }
    void cambiar(char palabras[]) {
    int i,aux;
    aux = 0;
    for(i = 0; i < 100 && aux == 0; i++) {
    if(palabras[i] == '
    ') {
    palabras[i] = '\0';
    }
    }
    }
    void insertar() {
    srand(time(NULL));
    int i,aux;
    char titulo[100];
    aux = 0;
    for(i = 0; i < 5 && aux == 0; i++) {
    if(libros[i].lleno == 0) {
    libros[i].paginas = rand()%1001;
    libros[i].precio = rand()%101;
    p("Introduce el t%ctulo del libro: ",161);
    fflush(stdin);
    fgets(titulo,100,stdin);
    cambiar(titulo);
    p("
    ");
    libros[i].titulo = (char*)malloc((strlen(titulo)+1)*sizeof(char));
    if(libros[i].titulo == NULL) {
    p("No se ha podido asignar un tamaño a la memoria.
    ");
    exit(1);
    }
    strcpy(libros[i].titulo,titulo);
    p("Introduce el autor del libro: ");
    fflush(stdin);
    fgets(titulo,100,stdin);
    cambiar(titulo);
    p("
    ");
    libros[i].autor = (char*)malloc((strlen(titulo)+1)*sizeof(char));
    if(libros[i].autor == NULL) {
    p("No se ha podido asignar un tamaño a la memoria.
    ");
    exit(1);
    }
    strcpy(libros[i].autor,titulo);
    p("El libro %s pertenece a %s, tiene %i p%cginas y cuesta %i euros.

    ",libros[i].titulo,libros[i].autor,libros[i].paginas,160,libros[i].precio);
    aux = 1;
    libros[i].lleno = 1;
    p("%i libros a%cadidos.

    ",i+1,164);
    }
    if(libros[5].lleno == 1) {
    p("No se puede a%cadir m%cs libros.

    ",164,160);
    }
    }
    }
    void buscar() {
    int opcion,aux,cmp,i;
    char titulo[100];
    aux = 0;
    do {
    p("Elige una opci%cn:
    ",162);
    p("=================

    ");
    p("[1] - Buscar por t%ctulo.
    ",161);
    p("[2] - Buscar por autor.

    ");
    p("Opci%cn: ",162);
    fflush(stdin);
    s("%i",&opcion);
    p("
    ");
    } while(opcion < 1 || opcion > 2);
    if(opcion == 1) {
    p("Introduce el t%ctulo a buscar: ",161);
    fflush(stdin);
    fgets(titulo,100,stdin);
    cambiar(titulo);
    p("
    ");
    for(i = 0; i < 5 && aux == 0; i++) {
    cmp = strcmp(titulo,libros[i].titulo);
    if(cmp == 0) {
    p("El libro %s pertenece a %s, tiene %i p%cginas y cuesta %i euros.

    ",libros[i].titulo,libros[i].autor,libros[i].paginas,160,libros[i].precio);
    aux = 1;
    }
    }
    } else {
    if(opcion == 2) {
    p("Introduce el autor a buscar: ");
    fflush(stdin);
    fgets(titulo,100,stdin);
    cambiar(titulo);
    p("
    ");
    for(i = 0; i < 5 && aux == 0; i++) {
    cmp = strcmp(titulo,libros[i].autor);
    if(cmp == 0) {
    p("El libro %s pertenece a %s, tiene %i p%cginas y cuesta %i euros.

    ",libros[i].titulo,libros[i].autor,libros[i].paginas,160,libros[i].precio);
    aux = 1;
    }
    }
    }
    }
    }

  • @marktulsoto8685
    @marktulsoto8685 3 ปีที่แล้ว

    Mi codigo:
    #include
    #include
    #include
    #define N 50
    typedef char* String;
    typedef struct{
    String name;
    String author;
    }Book;
    Book newBook(String,String);
    void freeBook(Book);
    void fixStringEnd(char []);
    int main()
    {
    char name[N]="";
    char author[N]="";
    printf("Write the name of book: ");
    fgets(name,N,stdin);
    fixStringEnd(name);
    printf("Write the author: ");
    fflush(stdin);//LIMPAR BUFFER
    fgets(author,N,stdin);
    fixStringEnd(author);
    Book book=newBook(name,author);
    printf("the book called: %s was written by: %s
    ",book.name,book.author);
    freeBook(book);
    system("pause");
    return 0;
    }
    void fixStringEnd(char s[]){
    for(int i=0;i