Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - leosansan

#1281
Programación C/C++ / LISTA DOBLE
29 Septiembre 2012, 12:30 PM
Tengo el problema en una lista doblemente enlazada que no me imprime al reves, es decir de abajo a arriba, es más se suele colgar al final. Y no pillo el fallo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct lista_elementos
{
char elem[40];
struct lista_elementos *sig;
struct lista_elementos *ant;
};

typedef struct lista_elementos nodo;

void crear(nodo *registro,nodo *fin,nodo *anterior);
void mostrar_abajo(nodo *pt);
void mostrar_arriba(nodo *pt);

int main()
{
   nodo *prin,*fin;
   prin=(nodo*)malloc(sizeof(nodo));
   fin=(nodo*)malloc(sizeof(nodo));
   crear(prin,fin,NULL);
   puts("\n");
   mostrar_abajo(prin);
   puts("\n");
   mostrar_arriba(fin);
}

void crear(nodo *registro,nodo *fin,nodo *anterior)
{
   printf("Dato (Escribir LEOSANSAN para terminar): ");
   scanf(" %s",registro->elem);

   if (strcmp(registro->elem,"LEOSANSAN")==0)
           {
           registro->sig=NULL;
           registro->ant=anterior;
           fin=registro;
       }
   else
       {
           registro->sig=(nodo*)malloc(sizeof(nodo));
           registro->ant=anterior;
           crear(registro->sig,fin,registro);
       }
}

void mostrar_abajo(nodo *pt)
{
   if (pt->sig!=NULL)
       {
           printf("%s  ",pt->elem);
           mostrar_abajo(pt->sig);
       }
}
void mostrar_arriba(nodo *pt)
{
  if (pt->ant==NULL)
   printf("%s",pt->elem);
   else
       {
           printf("%s  ",pt->elem);
           mostrar_arriba(pt->ant);
       }
}

Gracias desde ahora y saludos!.
#1282
Programación C/C++ / Re: Duda con scanf
29 Septiembre 2012, 12:24 PM
Cita de: Caster en 29 Septiembre 2012, 11:23 AM
En un ejemplo de un codigo en un libro que estoy leyendo, me he encontrado con esta linea:
scanf("%[^\n]", linea);
La parte que no entiendo es la de "%[\n]", creo que sirve para guardar la linea de texto introducida en el array linea,
Como te han comentado, "entra" todo en el scanf y a diferencia de éste que sólo entra hasta encontrar un espacio en blanco, o si introduces 123asd y el scanf tiene en su formato %d sólo coge el número, ahora la cadena linea puede contener espacios en blanco. Como ejemplo, y aprovechando el otro hilo de scanf sin fflush, puedes probar 123asd asd. Te dejo éste código:
#include <stdio.h>
int main(){
char linea [80];
char ch1, ch2;
scanf("%[^\n]%*c", linea);
printf("Ingrese 1: ");
scanf("%c%*c",&ch1);
printf("Ingrese 2: ");
        scanf("%c%*c",&ch2);
printf("%c  %c   %s\n", ch1, ch2,linea);
return 0;
}

Te dejo esta referencia http://beej.us/guide/bgc/output/html/multipage/scanf.html
Saludos
#1283
Cita de: Ixcal en 28 Septiembre 2012, 22:28 PMhe estado leyendo por el foro que la función fflush no es conveniente usarla en los programas, entonces ¿Está mal que la use en mi código?.
En este caso está de más. Prueba a quitarla. Otra cosa sería si usaras scanf.
#1284
Cita de: 0xDani en 28 Septiembre 2012, 20:30 PM
Reservas 80 bytes para nombre, y permites que se ingresen 100 caracteres con fgets().
LAS PRISAS SON MALAS CONSEJERAS.
#include <stdio.h>
#include<stdlib.h>
int main()
{
char *nombre;
nombre = (char *)malloc (100*sizeof(char));
char *saludo = "buenos dias";
printf("por favor ingrese su nombre \n");
    fgets (nombre, 100,stdin);
printf("%s %s",saludo,nombre);
return 0;
}

Espero ir más tranquilo para no pifiarla en esas tonterias.
Gracias y un saludo!
#1285
CitarGracias por las observaciones rir, Como siempre que respondes, aprendo o tengo presente algo nuevo.
Habrás observado que te hice caso en lo del uso de fgets frente a gets.
Lo de "sizeof(char)" es para que Ixcal lo "vea mejor. Así en caso de tratarse de un int, float o double tenga presente su uso.

Un saludo
PD: Reedite el post anterior para tener en cuenta lo de stdlib.
#1286
Cita de: rir3760 en 28 Septiembre 2012, 02:05 AM
No es valido. Toda variable local inicia con un valor no definido o "basura", antes de utilizar ese puntero se debe almacenar en el una dirección valida ya sea mediante el operador "&" (no necesario en el caso de arrays) o el valor de retorno de malloc/calloc/realloc.
Como ves, si no es con array llegamos a punteros.
Más o menos, algo así:
#include <stdio.h>
#include<stdlib.h>
int main()
{
char *nombre;
nombre = (char *)malloc (80*sizeof(char));
char *saludo = "buenos dias";
printf("por favor ingrese su nombre \n");
fgets (nombre, 100,stdin);
printf("%s %s",saludo,nombre);
return 0;
}

Utilizo fgets porque se sobreentiende que al introducir nombre y apellido van a ir separados por un espacio en blanco, cosa que no consigues con el scanf tal como lo tienes. Lo considero más fácil que con variantes de scanf.
Un saludoPD:Reditado
#1287
Cita de: Ixcal en 27 Septiembre 2012, 23:22 PM
Hola tengo una duda.
Lo que hice fue crear un array de 80 elementos para guardar el nombre que se ingresara y hasta ahí todo bien.
CitarHasta ahí todo bien.
CitarAsí que mi duda es: ¿Se puede guardar una cadena de caracteres de otra forma en C? o si existe algún tipo de variable que sea tipo string o algo así.
Que yo sepa en C no, a no ser con el uso de punteros y la asignación dinámica de memoria Otra cosa es en C++ con la clase string, pero es muy avanzado para el nivel en que están.
Le entendiste mal o, lo más probable, se expresara mal.
Saludos!.
#1288
Cita de: Caster en 27 Septiembre 2012, 19:26 PM
Lo he copiado exactamente igual que aquí. Sigue sin pararse.

CitarPues no lo entiendo. Lo he probado en Code::Blocks, en Dev-C++ y en Pelles C y en todos funciona.
Ahora lo entiendo, estaba usando gets en lugar de scanf:
#include <stdio.h>

int main() {

   int i;
   char cadena [80];

   gets( cadena);

   for (i=0;cadena [i]!='\0';i++);

   printf ("\nEl texto tiene %d caracteres.\n",i);
   printf ("\nPresione ENTER para salir:");
   while (getchar()!='\n')
       ;
   return 0;
}

Para que no te pase lo del scanf, usalo de este modo ... se come el "\n":
#include <stdio.h>

int main() {

   int i;
   char cadena [80];
   scanf("%s%*c", cadena);
   for (i=0;cadena [i]!='\0';i++);
   printf ("\nEl texto tiene %d caracteres.\n",i);
   printf ("\nPresione ENTER para salir:");
   while (getchar()!='\n')
       ;
   return 0;
}

Saludos
#1289
Cita de: Caster en 27 Septiembre 2012, 18:27 PM
Lo he compilado y el programa no se pausa, se cierra.
CitarCreo que no te has fijado bien en el punto y coma ";" después del while. Este es el que "obliga" al programa a esperar el ENTER para cerrar.
Saludos
#1290
Cita de: eleon en 27 Septiembre 2012, 18:21 PM
El usuario introduce un número seguido de letras (sin ninguna separación) pero la entrada estándar se come el último dígito del número. He puesto un ejemplo en el primer post.
No se come nada:
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
int main()
{
    int entero;
    cin >> entero;
    cout << "entero=" << entero<< endl;
    return 0;
}

Saludos.