elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str  (Leído 2,343 veces)
soundevice

Desconectado Desconectado

Mensajes: 3


Ver Perfil
[AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
« en: 28 Septiembre 2016, 22:44 pm »

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:

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;
    
}


« Última modificación: 28 Septiembre 2016, 22:51 pm por soundevice » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
« Respuesta #1 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
Código:
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?
Código:
char * algo = "otra cosa";


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


En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
« Respuesta #2 en: 29 Septiembre 2016, 02:02 am »

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

cada vez que hacer
Código:
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?
Código:
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
En línea

soundevice

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
« Respuesta #3 en: 29 Septiembre 2016, 02:45 am »

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

cada vez que hacer
Código:
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?
Código:
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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
C# Leer y guardar cada linea de un archivo .txt en una nueva variable
.NET (C#, VB.NET, ASP)
extreme69 6 28,792 Último mensaje 22 Julio 2011, 00:54 am
por $Edu$
[?] leer binario y guardar en struct dato AYUDA « 1 2 »
Programación C/C++
nolosabe 17 9,174 Último mensaje 29 Octubre 2011, 15:44 pm
por nolosabe
Ayuda leer cadenas y guardarlas en una sola variable
Programación C/C++
rulax01 3 2,076 Último mensaje 21 Noviembre 2014, 00:49 am
por zShackra
[Ayuda] variable dentro de char (solucionado) « 1 2 »
Programación C/C++
sabeeee 11 6,112 Último mensaje 24 Diciembre 2014, 21:20 pm
por sabeeee
Ayuda para guardar como char o como int
Programación C/C++
ciquee 5 2,773 Último mensaje 11 Marzo 2019, 18:24 pm
por ciquee
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines