Error raro en la compilación de este sencillo código.

Iniciado por OmarHack, 7 Junio 2013, 17:25 PM

0 Miembros y 2 Visitantes están viendo este tema.

OmarHack

Se podría cambiar sin problemas, pero eso haría el código más extenso. Aún que está genial saber como se hizo la rueda por si le quieres quitar las llantas y meterle otras más grandes. ;)
I like to test things.

amchacon

#21
Cita de: leosansan en  9 Junio 2013, 08:00 AM
¿Y sin string, o sea programando nosotros lo que en el fondo hace string?:
Estás limitando la entrada a 19 letras (como le metas 25 te va a dar un desbordamiento de buffer).

Me parece que esto sería más correcto:

Código (cpp) [Seleccionar]
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int main()
{
    char valor;
    vector<char> palabra;
    char palabra2[]="qw";

    cout << "introduce letras: ";
    valor = getch();
    do
    {

        palabra.push_back(valor);
        cout<<valor;
        valor = getch();
    }
    while (valor != '\r'); // Enter
   
    cout<<endl;
   
    palabra.push_back('\0');
    int i;
    for (i=0; palabra[i]!='\0'; i++)
        if (palabra[i]==palabra2[i])
            continue;
    if (i==2)
        cout <<"Hola mundo";
    cin.get();
    return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#22
Cita de: amchacon en  9 Junio 2013, 13:40 PM
Estás limitando la entrada a 19 letras (como le metas 25 te va a dar un desbordamiento de buffer).

Me parece que esto sería más correcto:

Código (cpp) [Seleccionar]
#include <iostream>
[color=red][size=10pt][b]#include <conio.h>[/b][/size][/color]
[size=10pt][b]#include <vector>[/b][/size]
using namespace std;
int main()
{
  .....................................


¡amchcon has hecho uso de la librería conio ..... y de getch!. ¡¡¡¡Dos pecados mortales !!!!! :laugh:

Pues yo, siguiendo los pasos del maestro rir ,hago otra propuesta, eso sí espero que alguien la "pase" a C++  ;) ....a buen entendedor, pocas palabras:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *palabra,*aux,palabra2[]="qw";
   int ch;
   int i=0,j=0;
   palabra = NULL;
   while ((ch = getchar()) != '\n'){
       if ((aux = realloc(palabra, (i + 10) * sizeof *palabra)) == NULL){
           puts("No hay espacio en memoria\n");
           free(palabra);
           return EXIT_FAILURE;
       }
       palabra = aux;
       palabra[i++] = ch;
   }
   palabra[i++] = '\0';
   for (i = 0; palabra[i] != '\0'; i++)
       if (palabra[i] != palabra2[i])
           break;
   if (i==2)
       {puts("Hola mundo\n");}
  return EXIT_SUCCESS;
}


Saluditos! .... ..


amchacon

#23
Cita de: leosansan en  9 Junio 2013, 15:21 PM
¡amchcon has hecho uso de la librería conio ..... y de getch!. ¡¡¡¡Dos pecados mortales !!!!! :laugh:
:silbar: :silbar: :silbar: :silbar:

Tú código está bastante correcto. Lo que mejoraría son los reallocs, en vez de 1 en 1 hazlos de 5 en 5 o de 10 en 10 (El realloc puede ser una operación costosa).

Cita de: leosansan en  9 Junio 2013, 15:21 PMeso sí espero que alguien la "pse" a C++
¡Adelante!  ;-)

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

char* Realloc(char* Puntero,int Original,int Final);

const int INTERVALO_REALLOC = 5;

int main(void)
{
   char *palabra,*aux,palabra2[]="qw";
   int ch;
   int i=0,j=0;
   int ultimorealloc = 0;
   palabra = NULL;

   aux = new char[INTERVALO_REALLOC];

   while ((ch = cin.get()) != '\n')
  {
       if ((i-ultimorealloc) == INTERVALO_REALLOC)
       {
           ultimorealloc = i;

           if ((aux = Realloc(palabra,i, (i + INTERVALO_REALLOC) * sizeof *palabra)) == NULL){
               cerr<<"No hay espacio en memoria\n";
               delete[] palabra;
               return 1;
           }

       }
       palabra = aux;
       palabra[i++] = ch;
   }
   palabra[i++] = '\0';
   cout<<palabra<<endl;
   for (i = 0; palabra[i] != '\0'; i++)
   if (palabra[i] != palabra2[i])
     break;
   if (i==2)
       cout<<"Hola mundo\n";

   cout<<palabra;
//cin.get();
  return 0;
}


char* Realloc(char* Puntero,int Original,int Final)
{
   char* Aux = new(nothrow) char[Final];

   if (!Aux)
       return NULL;

   for (int i = 0; i < Original;i++)
   {
       Aux[i] = Puntero[i];
   }

   delete[] Puntero;

   return Aux;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

¿Se os ocurre como hacer que si el texto introducido por teclado lleva un espacio se guarde en otro string?
Que haga algo así:
Código (cpp) [Seleccionar]
if (string1 tiene un espacio)
{
guardar hasta el espacio string1;
guardar a partir del espacio hasta el siguiente espacio o final del texto en string2;
if (string2 tiene un espacio)
{
guardar a partir del espacio hasta el siguiente espacio o final del texto en string3;
........................................................
}
}


Al poner por ejemplo en el programa: "paco gonzalez martinez"
guarde "paco" en string1, "gonzalez" en string2 y "martinez" en string3.

Así podré ejecutar acciones para todos los que sean gonzalez de primer apellido, independientemente de si se llaman paco o tienen de segundo apellido martinez o gonzalez o lo que sea.

Llevo bastante buscando y no encuentro nada que me sirva.
A ver si vosotros sabéis.
Si encuentro algo lo pondré aquí.
Saludos.
I like to test things.

leosansan


Duda de novatillo en C++, ¿no sería más simple usar realloc en C++, como yo hice en C. o no se puede?. La verdad es que lo he intentado pero con resultados "insatisfactorios".


Saluditos! .... ..



amchacon

Cita de: leosansan en  9 Junio 2013, 16:43 PM
Duda de novatillo en C++, ¿no sería más simple usar realloc en C++, como yo hice en C. o no se puede?. La verdad es que lo he intentado pero con resultados "insatisfactorios".


Saluditos! .... ..



El realloc de C funciona claro:

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    char* cosa = new char[3];
    realloc(cosa,50);

    for (int i = 0; i < 50;i++)
      cosa[i] = i+48;

    cosa[49] = '\0';

    cout<<cosa;
    return 0;
}


Pero tu me has dicho C++ puro asi que :S

Cita de: OmarHack en  9 Junio 2013, 16:37 PM
¿Se os ocurre como hacer que si el texto introducido por teclado lleva un espacio se guarde en otro string?
Que haga algo así:
Código (cpp) [Seleccionar]
if (string1 tiene un espacio)
{
guardar hasta el espacio string1;
guardar a partir del espacio hasta el siguiente espacio o final del texto en string2;
if (string2 tiene un espacio)
{
guardar a partir del espacio hasta el siguiente espacio o final del texto en string3;
........................................................
}
}


Al poner por ejemplo en el programa: "paco gonzalez martinez"
guarde "paco" en string1, "gonzalez" en string2 y "martinez" en string3.

Así podré ejecutar acciones para todos los que sean gonzalez de primer apellido, independientemente de si se llaman paco o tienen de segundo apellido martinez o gonzalez o lo que sea.

Llevo bastante buscando y no encuentro nada que me sirva.
A ver si vosotros sabéis.
Si encuentro algo lo pondré aquí.
Saludos.

Pues:

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    string Nombres[3];

    for (int i = 0; i <3;i++)
        cin>>Nombres[i];

       for (int i = 0; i <3;i++)
        cout<<Nombres[i]<<endl;

    return 0;
}


Cuando termines de meter nombres le das a enter y listo :S
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: leosansan en  9 Junio 2013, 09:13 AM
Cita de: rir3760En el bucle:
Código (cpp) [Seleccionar]
for (i=0;palabra[i]!='\0';i++)
   if (palabra[i]==palabra2[i])
      continue;

El condicional no tiene efecto.

tiene efecto, combinado con la línea que le sigue. Fíjate bien en el if con la i, y si no pruébalo
Para explicarlo mejor, el bucle es:
Código (cpp) [Seleccionar]
int i;
for (i = 0; palabra[i] != '\0'; i++)
   if (palabra[i] == palabra2[i])
      continue;

if (i==2)
   cout <<"Hola mundo";

El cuerpo de este es una sola sentencia, el condicional:
Código (cpp) [Seleccionar]
if (palabra[i] == palabra2[i])
   continue;

Si se cumple la condición (los caracteres son iguales) se pasa a la siguiente iteracion del bucle (debido a la sentencia "continue;") y si no se cumple como no hay mas que ejecutar ... también.

En algunas ocasiones utilizas bucles como este:
Código (cpp) [Seleccionar]
for (i = 0; palabra[i] != '\0'; i++)
   if (palabra[i] == palabra2[i])
      continue;
   else
      break;

Supongo la intención con el programa (de este tema) es la misma.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

OmarHack

rir3760, no me enteré de nada. :xD
¿Cuál es la diferencia con el código que puso Amchacon?
PD: Gracias y perdón por mi ignorancia!
I like to test things.

amchacon

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar