¿Cómo validar espacios vacíos en C++?

Iniciado por Juancho25, 6 Mayo 2013, 00:02 AM

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

Juancho25

Hola, lo que necesito es que cuando pida ingresar un dato y se presione la tecla enter dejando el espacio vacío, no continúe a la siguiente opción sino que permanezca en la misma hasta que se metan datos y no quede el espacio en blanco. Espero me puedan ayudar.

Blaster

Segun lo que entendi podria hacerlo asi:

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

using namespace std;

int main()
{
   int aux;
   do{
     cout << "Ingrese un dato: ";
     cin >> aux;
    }
   while(aux == 32);

   cin.get();
   return 0;
}


Saludos  :laugh:

Juancho25

Cita de: малко en  6 Mayo 2013, 00:35 AM
Segun lo que entendi podria hacerlo asi:

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

using namespace std;

int main()
{
   int aux;
   do{
     cout << "Ingrese un dato: ";
     cin >> aux;
    }
   while(aux == 32);

   cin.get();
   return 0;
}


Saludos  :laugh:

Gracias pero veo que ese código es para tipo int, también lo necesito para char el cual tengo con gets(variable) para que me acepte espacios. ¿Sabes cómo podría hacerle?

Blaster

#3
Siendo asi el caso quedaria de esta forma, lo he hecho en c++:

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

using namespace std;

int main()
{
   char palabra[30];

   do{
     cout<<"Ingresa una cadena: ";
     cin.getline(palabra, 30, '\n');
    }
     while(strchr(palabra, 32));

   cin.get();
   return 0;
}


No te recomiendo que uses gets las razones aqui:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Espero haberte ayudado cualquier duda hazmelo saber..

Un Saludo!!  ;D

RyogiShiki

#4
A continuación una solució un poco más genérica:
Código (cpp) [Seleccionar]
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string dataIn;
    bool dataEntered = false;

    while (!dataEntered)
    {
        cout << "Introduce un dato: ";
        getline(cin, dataIn);
        if (dataIn.empty())
        {
            cout << "Ningun dato fue ingresado" << endl;
        }
        else
        {
            dataEntered = true;
        }
    }

    // Si necesitamos el dato en un int, float, double...
    istringstream stringStream(dataIn);

    // Aqui puede ser un float, un int, un double....
    int v;
    if (!(stringStream >> v))
    {
        cout << "Error dato no numerico..." << endl;
        cout << "Raw Dato: " << dataIn << endl;
    }
    else
    {
        cout << "Raw Dato: " << dataIn << endl;
        cout << "Dato: " << v << endl;
    }

    return 0;
}



Documentación:
StringStreams


Juancho25

Cita de: малко en  6 Mayo 2013, 04:26 AM
Siendo asi el caso quedaria de esta forma, lo he hecho en c++:

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

using namespace std;

int main()
{
   char palabra[30];

   do{
     cout<<"Ingresa una cadena: ";
     cin.getline(palabra, 30, '\n');
    }
     while(strchr(palabra, 32));

   cin.get();
   return 0;
}


No te recomiendo que uses gets las razones aqui:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Espero haberte ayudado cualquier duda hazmelo saber..

Un Saludo!!  ;D

Implementé el código de arriba y me funcionó, sólo un pequeño problema, no me permite ingresar más de 2 palabras, es decir, al momento de dejar el espacio para poner la segunda palabra, me marca como si estuviera vacío y me regresa a que ingrese de nuevo el texto.

rir3760

Cita de: FMR en  6 Mayo 2013, 06:25 AMsólo un pequeño problema, no me permite ingresar más de 2 palabras, es decir, al momento de dejar el espacio para poner la segunda palabra, me marca como si estuviera vacío y me regresa a que ingrese de nuevo el texto.
Si estas aprendiendo C++ lo mejor es seguir el ejemplo de RyogiShiki ya que al utilizar la biblioteca estándar de C++ te olvidas de ciertos problemas (por ejemplo la longitud de la linea).

El programa que mencionas no acepta lineas con mas de una palabra porque su condición de salida lo prohíbe:
Código (cpp) [Seleccionar]
while(strchr(palabra, 32));
La función strchr retorna verdadero (una dirección diferente de NULL) cuando el carácter indicado por el segundo argumento (en este caso 32, mejor indicarlo con ' ') se encuentra en la cadena (primer argumento). Es por eso que el bucle se repetirá mientras la linea contenga un espacio.

En su lugar se debe verificar que la linea contenga al menos un caracter que no sea espacio o tabulador. Para ello se puede utilizar:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char linea[30];
   size_t pos;
   
   do {
      cout << "Ingresa una cadena: ";
      cin.getline(linea, 30);
     
      pos = strspn(linea, " \t");
   }while (linea[pos] == '\0');
   
   cout << "Linea: " << linea << endl;
   
   return 0;
}


Pero, de nuevo, mejor enfocate en aprender la biblioteca estándar de C++.

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