[AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str

Iniciado por soundevice, 28 Septiembre 2016, 22:44 PM

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

soundevice

Hola Queridos colegas programadores. Me llamo Gabriel y soy estudiante de Sistemas Especializado en Java. Hoy me pidieron entregar un ejercicio en el que se debe programar en C, y no nos explicaron eso en toda la cursada. Es decir, hay que arreglarselas con Internet.
La consigna es que lo compile en la consola de Ubuntu, y el usuario ingrese el nombre de un archivo que este en el directorio actual, y depende su extensión (jpg, mp3 o txt) le cambiara el nombre (de txt a no me acuerdo, supongamos que a mp3, y asi con cada uno cambiarlo a otra extension (en el código queda claro)). Después de renegar mucho y buscar equivalentes a funciones de java en c para poder armar el código (que parece sencillo, pero venir de java a c, es complejo, muchas cosas son muy distintas, que no te mientan) pude lograr que el código funcione. Haga lo que tenga que hacer.
El código anda. Por ejemplo, creo un archivo en un directorio, el archivo es ejemplo.txt
Después en mi código defino a char *str= ejemplo.txt y hace el cambio de extensión exitosamente.
Pero ahora lo que quiero es que char *str se defina por lo que el usuario le pase por teclado.
Intente con las siguientes, y me lanzan este tipo de errores:
   main ( char *argv) Me tira violacion de segmento
  scanf("%s",str); No me sirve. Ingreso el dato y me devuelve violación de segmento (core)
  fgets (str, strlen(str), stdin) == NULL;Ingreso el dato y me devuelve violacion de segmento (core)
  /gets(str) Me dice que no esta definida gets
Nose me ocurre que hacer para arreglarlo. Es lo único que falta. Lo invito a que defina a char *str con algun archivo suyo y haga la prueba, vera que funciona. Lo único que me falta es que se le asigne la cadena que ingresa el usuario.
Sé que las funciones scanf y gets no funcionan, por que en mi código no definí a los chars con un número de tamaño. Investigando vi que todos ya saben de antemano cuanto mide su cadena y la definen. Ejemplo, char *prueba[3]= "ere". Pero yo no se la longitud del nombre del archivo  que va a ingresar el usuario. y probé definiendo a char *str con diferentes números, pero haciendo eso, desde la función rename hasta la de strlen y todas la que interactúan con mi cadena str, me dan el error: la función pide un argumento tipo char * y usted le pasa un argumento char **
Si me pueden ayudar a ingresar el dato por teclado y quede guardado en la variable str, se lo s agradeceré muchísimo! Acepto cualquier sugerencia útil! Y desde ya gracias por su tiempo amigos!
Código:

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

int main ()
{
  char *temporalsito;
  char *mp3 = "mp3";
  char *jpg = "jpg";
  char *txt = "txt";
  int esMp3 = 0;
  int esTxt = 0;
  int esJpg = 0;
  char *str = "Rata.mp3";
 
 
  //scanf("%s",str); No me sirve. Ingreso el dato y me devuelve violacion de segmento (core)
  //fgets (str, strlen(str), stdin) == NULL;Ingreso el dato y me devuelve violacion de segmento (core)
  //gets(str) Me dice que no esta definida gets
 

  int len = strlen(str);
  char *extension = &str[len-3];
  char nueva[str[len]];
  int posicion = strlen( str ) - strlen( strstr( str, extension ) );
   
    // copiar la primera parte
 for( int a = 0; a < posicion; a++ ){
    nueva[ a ] =str[ a ];}
   
    // copiar la segunda parte
    for( int l = posicion;l < strlen(str ); l++ ){
    nueva[ l ] = str[ l+3 ]; }// 3 es el tamaño de la parte
   
 nueva[strlen( nueva )] = '\0';
// printf( "%s\n", nueva );
  for (int  d=0; d <= 3; d++){
      if (mp3[d] == extension[d]){
         esMp3 = esMp3 +1;
  }
      else if (txt[d] == extension[d]){
         esTxt = esTxt + 1;
  }
      else if (jpg[d] == extension[d]){
         esJpg= esJpg +1;
  }
     else {
        printf("Imposible hacer la conversión, ingrese un archivo compatible con el  logaritmo la próxima vez.\n");
         return 0;
  }
  }
  printf("El archivo que modificaremos es %s\n",str);
  printf("la extension es %s\n",extension);
 //comparo variables de extensiones y pongo nombre provisorio
 if (esMp3>2){
 
     temporalsito = "jpg";
  }
  else if (esJpg>2){
   
      temporalsito = "txt";
  }
  else if (esTxt>2){
   
    temporalsito = "mp3";
  }
 

  strcat(nueva , temporalsito);

  int ret;
  ret = rename(str, nueva);
 
  if(ret == 0)
  {
     printf("Nombre Cambiado Correctamente. Su nuevo nombre es %s\n", nueva);
  }
  else
  {
     printf("Error: No se puede cambiar de nombre. \n");
  }
 
 
 return 0;
   
}

engel lex

veo que no estás acustumbrado a trabajar con tan bajo nivel... te explico...

cada vez que hacer
char * algo
simplemente estás dandole una posición de memoria a "algo" pero no estás reservando el espacio... así que cuando intentas acceder a la memoria da core dump...

tienes 2 caminos... o asignas memoria dinamicamente (malloc, calloc) o predefines el char a lo más largo posible... no importa que el char tenga más espacios asignados de lo necesario, las funciones sobre strings (printf, strlen, etc) se limitan a leer hasta conseguir un caracter de terminación ('\0')

por que funciona bien esto?
char * algo = "otra cosa";

cuando el compilador hace su trabajo, revisa que tiene que apartar el espacio de memoria y así lo hace
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

soundevice

Cita de: engel lex en 28 Septiembre 2016, 22:59 PM
veo que no estás acustumbrado a trabajar con tan bajo nivel... te explico...

cada vez que hacer
char * algo
simplemente estás dandole una posición de memoria a "algo" pero no estás reservando el espacio... así que cuando intentas acceder a la memoria da core dump...

tienes 2 caminos... o asignas memoria dinamicamente (malloc, calloc) o predefines el char a lo más largo posible... no importa que el char tenga más espacios asignados de lo necesario, las funciones sobre strings (printf, strlen, etc) se limitan a leer hasta conseguir un caracter de terminación ('\0')

por que funciona bien esto?
char * algo = "otra cosa";



cuando el compilador hace su trabajo, revisa que tiene que apartar el espacio de memoria y así lo hace



Gracias, veré si lo puedo hacer. Sí, no estoy acostumbrado a un lenguaje de bajo nivel u.u

soundevice

Cita de: engel lex en 28 Septiembre 2016, 22:59 PM
veo que no estás acustumbrado a trabajar con tan bajo nivel... te explico...

cada vez que hacer
char * algo
simplemente estás dandole una posición de memoria a "algo" pero no estás reservando el espacio... así que cuando intentas acceder a la memoria da core dump...

tienes 2 caminos... o asignas memoria dinamicamente (malloc, calloc) o predefines el char a lo más largo posible... no importa que el char tenga más espacios asignados de lo necesario, las funciones sobre strings (printf, strlen, etc) se limitan a leer hasta conseguir un caracter de terminación ('\0')

por que funciona bien esto?
char * algo = "otra cosa";

cuando el compilador hace su trabajo, revisa que tiene que apartar el espacio de memoria y así lo hace
Funcionó , gracias!