[C con Clase] dudas sobre progrma

Salvador Pozo salvador en conclase.net
Mar Abr 23 18:01:24 CEST 2013


El pasado 2013-04-22 20:43:09, fanatidark escribió:
 
f> ...
f> ahora lo que pasa es lo siguiente...

Empiezo por el final.

f> 3.-cuando pongo la oracion si pongo una frase como seria "hola como estas" tambien se vuelve loco y me pasa lo que me pasa en el 2 por q???

Cuando se leen entradas del teclado usando el operador >> de cin hay que tener en cuenta algunas limitaciones.

Primero, la lectura termina cuando se localiza un espacio, o en general, cualquier carácter delimitador, como el tabulador.

Segundo, si estamos leyendo un número, y se encuentran caracteres no numéricos, se entra en un estado de error del que generalmente no es fácil salir.

Por eso te aconsejo que hagas algunas modificaciones.

Para leer cadenas que puedan contener espacios usa el método "getline" de cin, en lugar del operador >>. Así, para leer tu cadena usa esta sentencia:

   cout<<"escribe tu mensaje"<<endl;
   cin.getline(mensaje, 100);

Una ventaja adicional de este método es que es más seguro, ya que podemos indicar el tamaño del buffer en el que estamos leyendo. Esta función leerá una cadena desde el teclado hasta que encuentre el retorno de línea, o hasta que se lean 100 caracteres. De este modo no se desborda la cadena "mensaje" si se intenta leer una cadena de más de 100 caracteres.

En tu caso usabas el operador >>, que sólo leía la primera palabra, hasta el espacio, y dejaba el resto del texto en el buffer de entrada del teclado. Este texto es el que se intentaba leer en la siguiente lectura, y por eso el valor de opción no era el que esperabas.

f> 2.-a la hora de que me lanza la pregunta si quiero buscar un caracter y me da las opciones de 1 y 2 si llego a poner una letra el programa se vuelve loco y me cominza a sacar muchas lineas que no alcanzo a leer, no se supone que me debe de decir que la opcion no es valida debido a que asi dice en el swhitch?

Si se intenta leer un carácter en una variable entera se produce un error en el stream, y el valor leído es indeterminado. Como la condición de error no se elimina (no has puesto instrucciones para hacerlo), y tampoco se leen caracteres desde el buffer del teclado, si se repite el bucle, el proceso se repite indefinidamente.

Del mismo modo que es mejor usar una función para leer cadenas, lo mismo pasa para leer otros tipos de valores. En general, no es buena idea intentar leer números directamente, ya que los usuarios no son muy fiables en cuanto a lo que les pides. Por eso, si necesitas leer un número es mejor leer una cadena y convertirla a número usando atoi o atof.

En este caso, como sólo quieres leer un carácter, puedes usar la función get.

   char opcion;
...
   cout<<"quieres hacer la busqueda de algun caracter?"<<endl;
   cout<<" si=0"<<"\n no=1"<< endl;
   opcion = cin.get();

En ese caso, tendrás que modificar el switch para comparar con caracteres en lugar de números:

      case '0' :
      case '1' :
etc.

Y ya puestos, a lo mejor es preferible usar las letras 's' y 'n', y para evitar problemas de mayúsculas y minúsculas, comparar con ambas opciones:

      case 's' :
      case 'S' :
           <sentencias si se dijo que si>
           break;
      case 'n' :
      case 'N' :
           <sentencias si se dijo que no>
           break;
      default:
...


f> 1.-cuando pongo un caracter que no esta en la cadena me dice que el caracter esta en la pocicion 66 ....

Después de hacer esas modificaciones, a mi no me ha pasado nunca eso.

Otros consejos:

- Olvida el fichero de cabecera "conio.h", además de que no lo necesitas, no es estándar.
- No es necesario usar las llaves dentro de cada case. Los case son etiquetas, y la ejecución del programa es secuencial a partir de la que cumpla las condiciones.
- Pon todo el bloque de leer la respuesta (s/n) y el switch en un do..while:

do {
   leer respuesta;
   switch {
       case 's':
       case 'S':
           Busqueda;
           break;
       case 'n':
       case 'N':
           No buscar;
           break;
       default:
           Error;
   }
} while(opcion != 'n' && opcion != 'N');

Esto evita tener que leer el valor de opcion dos veces.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase