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 - rir3760

#1121
Cita de: do-while en  5 Noviembre 2012, 09:00 AM¿¿¿El objetivo no era no declarar ninguna variable???
Supongo te refieres al primer mensaje del tema, en el:

* En el código fuente se utiliza la variable "letra" para almacenar cada carácter.

* Se indica "lo que no se es como hacer en el bucle,que me escanee el segundo caracter,y luego el tercero y asi sucesivamente....y la palabra no puede estar almacenada en ninguna variable".

En base a ello yo supongo que no es valido utilizar un array de caracteres para ahí almacenar la palabra (por ejemplo mediante "scanf" con el especificador "%s"), en su lugar se debe leer un carácter, almacenarlo en una variable, procesarlo, leer el siguiente carácter, etc.

Si de eso se trata y se debe utilizar "printf" y "scanf" seria mas o menos asi:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch;
   
   puts("Introduce la palabra:");
   while (scanf("%c", &ch) == 1 && ch != '\n')
      printf("%c\n", ch);
   
   return EXIT_SUCCESS;
}


Un saludo
#1122
Programación C/C++ / Re: problema con vectores
5 Noviembre 2012, 02:31 AM
Es un error lógico: revisa con cuidado el nombre de la variable utilizada como contador en los dos bucles. De ahí se deriva el error (en el bucle interno).

Un saludo
#1123
Programación C/C++ / Re: Problema con realloc - c
5 Noviembre 2012, 02:26 AM
Cita de: HRSLASH en  5 Noviembre 2012, 02:18 AMLa idea era ir copiando caracter por caracter a un nuevo string sin los espacios en blanco e ir reservando memoria a medida que la fuera necesitando
No es necesario reservar el bloque de memoria antes de inserción, en su lugar haces una con el tamaño máximo (el peor escenario) y reajustas solo después de leer todos los caracteres. Para obtener el tamaño de la cadena puedes utilizar la función "strlen" (prototipo en <string.h>) o un bucle.

Por ejemplo (sin validación de errores):
#include <string.h>
#include <ctype.h>

/* ... */

char *borrar_espacios(const char *s)
{
   char *t = malloc(strlen(s) + 1);
   int i;
   
   for (i = 0; *s != '\0' && *s != '\n'; s++)
      if (!isspace(*s))
         t[i++] = *s;
   t[i++] = '\0';
   
   t = realloc(t, i);
   
   return t;
}


Un saludo
#1124
Cita de: do-while en  4 Noviembre 2012, 21:09 PMY otra alternativa que lee solo una linea:
#include <stdio.h>

int main(int argc, char *argv[])
{
    while(ungetc(getchar(),stdin) != EOF && ungetc(getchar(),stdin) != '\n')
        putchar(getchar());
    return 0;
}
Si bien funciona correctamente y se ahorra la declaración de una variable se debe pagar un precio elevado: cuatro llamadas a función por cada iteracion del bucle.

Otra opción es utilizar el mínimo de llamadas, si quieres retornar el ultimo carácter leído (en el caso de ser '\n') lo haces después del bucle:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int ch;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      putchar(ch);
   if (ch == '\n')
      ungetc('\n', stdin);
   
   return EXIT_SUCCESS;
}


Un saludo
#1125
Cita de: crazykenny en  4 Noviembre 2012, 17:11 PMpero ivorybom creo que ha comentado acerca de que, si el valor ya existe, tiene que pedir otro hasta que deje de repetirse, y, bueno, me imagino que sera de forma "indefinida", motivo por el cual he comentado acerca de lo de insertar el goto para que vuelva a preguntar el numero
No es necesaria una sentencia de salto "goto" porque si el numero esta repetido la iteracion se repite debido al decremento:
if (array[j]==array[i]){
   printf("Numero repetido.  ");
   i--; /* <== Al decrementar se repite la operacion */
   j--;
   break;
}


Y sin animo de molestar les recuerdo que una de las políticas de estos foros es no hacer las tareas del prójimo.

Un saludo
#1126
Para indicar el numero de decimales puedes utilizar el manipulador setprecision (si necesitas un ejemplo hay uno al final de esa pagina).

Un saludo
#1127
Programación C/C++ / Re: time() localtime()
3 Noviembre 2012, 16:55 PM
Cita de: Khronos14 en  3 Noviembre 2012, 13:50 PM
Te da fallo de segmentación por los punteros dia y mes. Los inicias a vacío y luego modificas su tamaño, sobreescribiendo datos de la pila que pueden afectar a otras variables.
No hay problema en la forma en que soyloqbuskas utiliza los punteros "mes" y "dia":
char *dia = "";

/* ... */

case 0:
   dia = "Sun";
   break;
case 1:
   dia = "Mon";
   break;

Ya que en cada una de esas asignaciones solo almacena en la variable "dia" una nueva dirección de memoria: la dirección donde se almacena la cadena literal.


En cuanto a la función para formatear la fecha no es necesario hacerlo manualmente, en su lugar se puede utilizar la función strftime (prototipo en <time.h>), por ejemplo (sin validación de errores):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *getDateTime(void);

int main (void)
{
   char *fecha;
   
   fecha = getDateTime();
   printf("%s\n", fecha);
   free(fecha);
   
   return EXIT_SUCCESS;
}

char *getDateTime(void)
{
   char *cad = malloc(1024);
   time_t t = time(NULL);
   struct tm *tm = localtime(&t);
   size_t nc;
   
   nc = strftime(cad, 1024, "Date: %a, %d %b %Y %H:%M:%S %Z", tm);
   cad = realloc(cad, nc + 1);
   
   return cad;
}


Un saludo
#1128
Otro error se encuentra en la función "equal_array":
if(x=0) return true;
if(x>0)return false;

Utilizas el operador de asignación "=" cuando debería ser el de comparación "==", debido a ello el valor de retorno de la función es "no definido".

Edito:

Considerando lo que hace la funcion "equal_array" su codigo es excesivamente largo, ella se puede reducir a:
bool equal_array(int a[],int b[])
{
   int i;
   
   for (i = 0; i < N && a[i] == b[i]; i++)
      ;
   
   return i == N;
}


Un saludo
#1129
Cita de: FMR en  2 Noviembre 2012, 06:23 AMya solucioné ese problema, sólo que tengo otro, aparte de aceptar sólo 8 dígitos, necesito que sólo sean números y no letras, ¿saben como le puedo hacer con eso?.
Solo tienes que seguir la recomendación de BlackZeroX (Astaroth): leer el numero y verificar su valor (99,000,000 <= x <= 99,999,999).

Un saludo
#1130
Considerando que el OP (me refiero a carrlos) ya se salto casi todas las Reglas del subforo lo mejor, a mi parecer, es no responder en el tema ya que  de hacerlo solo motivamos el mismo comportamiento.

Un saludo