No guarda la cadena dentro del vector

Iniciado por 7emiliosk8, 9 Febrero 2017, 21:19 PM

0 Miembros y 1 Visitante están viendo este tema.

7emiliosk8

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

printf("Ingrese una palabra: ");
scanf("%s",(vector+1));


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


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int i,j,a;
char **vector;

vector = (char**)malloc(2*sizeof(char*));

*(vector) = "hola";
*(vector + 1) = "perro";
printf("Ingrese una palabra: ");
scanf("%s",(vector+1));

puts("\nImprimiendo caracter a caracter:");
for(i=0;i<2;i++)
{
for(j=0; j<strlen(*(vector+i)) ; j++)
{
printf("%c",*(*(vector+i)+j));
}
puts("");
}

puts("\nImprimiendo completo:");
printf("%s\n",*vector);
printf("%s",*(vector+1));

free(vector);

return 0;
}


dato000

#1
Me remito al siguiente post:
http://stackoverflow.com/questions/14546018/using-scanf-function-with-pointers-to-character

cito:

Citarchar *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:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int i;
char** vector;

vector = (char**)malloc(sizeof(char*)*2); // solo permite dos palabras, separadas por salto de linea o por espacio

//*(vector) = "hola";
//*(vector + 1) = "perro";
printf("Ingrese una palabra: ");
for(i=0; i<2; i++)
       {
            vector[i] = (char*)malloc(sizeof(char)*100); // asumiendo que solo son palabras de máximo 100 cáracteres
            scanf("%s", &(*vector[i]));
       }

puts("\nImprimiendo:\n\n");
for(i=0; i<2; i++)
{
            printf("\n%d: %s", i, vector[i]);
}


for(i=0; i<2; i++)
       {
           free(&vector[i]);
       }
       free(vector);

return 0;

}




7emiliosk8

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... :/

dato000

No solo eso, sino que scanf y printf no funciona bien con char**.



ivancea96

Cita de: 7emiliosk8 en  9 Febrero 2017, 22:27 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:

#include <stdio.h>

int main(){
    char str[50];

    scanf("%s", str);

    printf("%s", str);
}

7emiliosk8

Cita de: ivancea96 en  9 Febrero 2017, 23:22 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:

#include <stdio.h>

int main(){
    char str[50];

    scanf("%s", str);

    printf("%s", str);
}


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
#include <stdio.h>

int main(){
    char str[50];

    scanf("%s", str);

    printf("%s", str);
}


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!

ivancea96

Cita de: 7emiliosk8 en  9 Febrero 2017, 23:29 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.

Cita de: 7emiliosk8 en  9 Febrero 2017, 23:29 PM
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).

7emiliosk8

#7
Cita de: ivancea96 en  9 Febrero 2017, 23:40 PM
Oh sí. La única peculiaridad es la de la constante. A parte de eso, eres libre.

cual seria la constante hermano ?

CitarComo 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?

int main()
{
int i,j;
char *vector[50];

vector = (char**)malloc(2*sizeof(char*));

for(i=0; i<2; i++)
   {
       printf("Ingrese una palabra: ");
       scanf("%s",vector[i]);
   }


en vez de haber pedido memoria con malloc asi ?

int main()
{
int i,j;
char **vector;

vector = (char**)malloc(2*sizeof(char*));

for(i=0; i<2; i++)
   {
       vector[i] = (char*)malloc(100*sizeof(char));
       printf("Ingrese una palabra: ");
       scanf("%s",*(vector+i));
   }


: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 ::)

ivancea96

Cita de: 7emiliosk8 en  9 Febrero 2017, 23:59 PM
cual seria la constante hermano ?
Lo de "hola".

Cita de: 7emiliosk8 en  9 Febrero 2017, 23:59 PM

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

int main()
{
int i,j;
char *vector[50];

vector = (char**)malloc(2*sizeof(char*));

for(i=0; i<2; i++)
   {
       printf("Ingrese una palabra: ");
       scanf("%s",vector[i]);
   }


en vez de haber pedido memoria con malloc asi ?

int main()
{
int i,j;
char **vector;

vector = (char**)malloc(2*sizeof(char*));

for(i=0; i<2; i++)
   {
       vector[i] = (char*)malloc(100*sizeof(char));
       printf("Ingrese una palabra: ");
       scanf("%s",*(vector+i));
   }

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].

Cita de: 7emiliosk8 en  9 Febrero 2017, 23:59 PM
: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

dato000

Cita de: ivancea96 en 10 Febrero 2017, 00:05 AM
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.