Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 7emiliosk8 en 9 Febrero 2017, 21:19 pm



Título: No guarda la cadena dentro del vector
Publicado por: 7emiliosk8 en 9 Febrero 2017, 21:19 pm
Hola en este codigo me da un error cuando le pido al usuario que ingrese una cadena y que modifique la que yo ya ingrese que es "perro", el problema esta en estas lineas

Código
  1. printf("Ingrese una palabra: ");
  2. scanf("%s",(vector+1));

si no las pongo funciona bien, pero yo quiero que el usuario pueda modificar ese "perro" que yo di.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7. int i,j,a;
  8. char **vector;
  9.  
  10. vector = (char**)malloc(2*sizeof(char*));
  11.  
  12. *(vector) = "hola";
  13. *(vector + 1) = "perro";
  14. printf("Ingrese una palabra: ");
  15. scanf("%s",(vector+1));
  16.  
  17. puts("\nImprimiendo caracter a caracter:");
  18. for(i=0;i<2;i++)
  19. {
  20. for(j=0; j<strlen(*(vector+i)) ; j++)
  21. {
  22. printf("%c",*(*(vector+i)+j));
  23. }
  24. puts("");
  25. }
  26.  
  27. puts("\nImprimiendo completo:");
  28. printf("%s\n",*vector);
  29. printf("%s",*(vector+1));
  30.  
  31. free(vector);
  32.  
  33. return 0;
  34. }
  35.  
  36.  


Título: Re: No guarda la cadena dentro del vector
Publicado por: dato000 en 9 Febrero 2017, 22:19 pm
Me remito al siguiente post:
http://stackoverflow.com/questions/14546018/using-scanf-function-with-pointers-to-character

cito:

Citar
char *pointers;
must be intelized. you can not scan string into pointers till you will give it a value (memory value) to point at. the computer needs to know where to store the value it read from key board.

Traducción: Los punteros de caracteres, deben ser inicializados, scanf no funciona con apuntadores ya que deben tener valores iniciales. El compilador tiene que saber en donde esta la información para que esta sea leida.

A lo mejor alguien sabe si se puede hacer, de momento dejo algo que me funciono:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7. int i;
  8. char** vector;
  9.  
  10. vector = (char**)malloc(sizeof(char*)*2); // solo permite dos palabras, separadas por salto de linea o por espacio
  11.  
  12. //*(vector) = "hola";
  13. //*(vector + 1) = "perro";
  14. printf("Ingrese una palabra: ");
  15. for(i=0; i<2; i++)
  16.        {
  17.             vector[i] = (char*)malloc(sizeof(char)*100); // asumiendo que solo son palabras de máximo 100 cáracteres
  18.             scanf("%s", &(*vector[i]));
  19.        }
  20.  
  21. puts("\nImprimiendo:\n\n");
  22. for(i=0; i<2; i++)
  23. {
  24.             printf("\n%d: %s", i, vector[i]);
  25. }
  26.  
  27.  
  28. for(i=0; i<2; i++)
  29.        {
  30.            free(&vector[i]);
  31.        }
  32.        free(vector);
  33.  
  34. return 0;
  35.  
  36. }
  37.  
  38.  


Título: Re: No guarda la cadena dentro del vector
Publicado por: 7emiliosk8 en 9 Febrero 2017, 22:27 pm
ah claro , me falto pedir memoria para los vectores que van dentro del vector ?
pero de todos modos si inicializara con el vector+1 con perro y depsues quisiera que el usuario ingresera una palabra da error... :/


Título: Re: No guarda la cadena dentro del vector
Publicado por: dato000 en 9 Febrero 2017, 22:47 pm
No solo eso, sino que scanf y printf no funciona bien con char**.


Título: Re: No guarda la cadena dentro del vector
Publicado por: ivancea96 en 9 Febrero 2017, 23:22 pm
pero de todos modos si inicializara con el vector+1 con perro y depsues quisiera que el usuario ingresera una palabra da error... :/

No se debe modificar una cadena literal ("abc"). El comportamiento de esto no está definido. Hay compiladores que colocan la cadena en una zona de memoria de solo-lectura, por ejemplo.

Para leer nuevos datos, tendrás que reservar nueva memoria.

Por cierto, depende de las necesidades pero, también se puede hacer esto con un array:

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.    char str[50];
  5.  
  6.    scanf("%s", str);
  7.  
  8.    printf("%s", str);
  9. }


Título: Re: No guarda la cadena dentro del vector
Publicado por: 7emiliosk8 en 9 Febrero 2017, 23:29 pm
No se debe modificar una cadena literal ("abc"). El comportamiento de esto no está definido. Hay compiladores que colocan la cadena en una zona de memoria de solo-lectura, por ejemplo.

Para leer nuevos datos, tendrás que reservar nueva memoria.

Por cierto, depende de las necesidades pero, también se puede hacer esto con un array:

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.    char str[50];
  5.  
  6.    scanf("%s", str);
  7.  
  8.    printf("%s", str);
  9. }

De lo primero no tenia idea que no se pued modiifcar una cadena definida como "cosa" pero si se puede hacer es pedir un scanf para una cadena y luego volver a pedir otro scanf para la misma cadena y ahi que si se reemplace ?

y de lo segundo que me dijiste de este codigo
Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.    char str[50];
  5.  
  6.    scanf("%s", str);
  7.  
  8.    printf("%s", str);
  9. }

Tu pusiste , "por ciento tambien se puede trabajar asi" pero yo en verdad siempre los trabajo asi XD , cual seria la otra forma de leerlo completo e imprimirlo completo ?
ojala me entiendas hermano, saludos!


Título: Re: No guarda la cadena dentro del vector
Publicado por: ivancea96 en 9 Febrero 2017, 23:40 pm
De lo primero no tenia idea que no se pued modiifcar una cadena definida como "cosa" pero si se puede hacer es pedir un scanf para una cadena y luego volver a pedir otro scanf para la misma cadena y ahi que si se reemplace ?
Oh sí. La única peculiaridad es la de la constante. A parte de eso, eres libre.

Tu pusiste , "por ciento tambien se puede trabajar asi" pero yo en verdad siempre los trabajo asi XD , cual seria la otra forma de leerlo completo e imprimirlo completo ?
ojala me entiendas hermano, saludos!

Como en los códigos de arriba lo hicisteis todo con malloc, pues por si acaso xD

¿Leerlo completo e imprimirlo completo? No entiendo. scanf va a leer la entrada del usuario completa y printf va a imprimir la variable completa (hasta el '\0', claro).


Título: Re: No guarda la cadena dentro del vector
Publicado por: 7emiliosk8 en 9 Febrero 2017, 23:59 pm
Oh sí. La única peculiaridad es la de la constante. A parte de eso, eres libre.

cual seria la constante hermano ?

Citar
Como en los códigos de arriba lo hicisteis todo con malloc, pues por si acaso xD

ah jajaj Tu dices para haberlo hecho asi como dices tu adentro del for?

Código
  1. int main()
  2. {
  3. int i,j;
  4. char *vector[50];
  5.  
  6. vector = (char**)malloc(2*sizeof(char*));
  7.  
  8. for(i=0; i<2; i++)
  9.    {
  10.        printf("Ingrese una palabra: ");
  11.        scanf("%s",vector[i]);
  12.    }
  13.  

 en vez de haber pedido memoria con malloc asi ?

Código
  1. int main()
  2. {
  3. int i,j;
  4. char **vector;
  5.  
  6. vector = (char**)malloc(2*sizeof(char*));
  7.  
  8. for(i=0; i<2; i++)
  9.    {
  10.        vector[i] = (char*)malloc(100*sizeof(char));
  11.        printf("Ingrese una palabra: ");
  12.        scanf("%s",*(vector+i));
  13.    }
  14.  

:P, otra cosa, no se como funcione este foro, pero no hay manera de darte puntos o algo xd ? tus respuestas siempre me resuelven las dudas que tengo ::)


Título: Re: No guarda la cadena dentro del vector
Publicado por: ivancea96 en 10 Febrero 2017, 00:05 am
cual seria la constante hermano ?
Lo de "hola".


ah jajaj Tu dices para haberlo hecho asi como dices tu adentro del for?

Código
  1. int main()
  2. {
  3. int i,j;
  4. char *vector[50];
  5.  
  6. vector = (char**)malloc(2*sizeof(char*));
  7.  
  8. for(i=0; i<2; i++)
  9.    {
  10.        printf("Ingrese una palabra: ");
  11.        scanf("%s",vector[i]);
  12.    }
  13.  

 en vez de haber pedido memoria con malloc asi ?

Código
  1. int main()
  2. {
  3. int i,j;
  4. char **vector;
  5.  
  6. vector = (char**)malloc(2*sizeof(char*));
  7.  
  8. for(i=0; i<2; i++)
  9.    {
  10.        vector[i] = (char*)malloc(100*sizeof(char));
  11.        printf("Ingrese una palabra: ");
  12.        scanf("%s",*(vector+i));
  13.    }
  14.  
No no, osea, o con array [N] o con malloc. Me refiero a que comenté lo del array porque solo os vi haciéndolo con malloc, como otra posibilidad.
Sí que se podría hacer con char vector[2][50].

:P, otra cosa, no se como funcione este foro, pero no hay manera de darte puntos o algo xd ? tus respuestas siempre me resuelven las dudas que tengo ::)
No es ese tipo de foros :P Pero lo anoto en mi libreta de puntos imaginarios :D


Título: Re: No guarda la cadena dentro del vector
Publicado por: dato000 en 10 Febrero 2017, 16:35 pm
No no, osea, o con array [N] o con malloc. Me refiero a que comenté lo del array porque solo os vi haciéndolo con malloc, como otra posibilidad.
Sí que se podría hacer con char vector[2][50].

De hecho para ese tipo de estructuras, me parece mucho mejor trabajarlo con matrices.