[C con Clase] no puedo usar una funcion mas de 2 veces sino explota el programa

Steven Davidson srd4121 en njit.edu
Lun Mar 14 03:07:29 CET 2011


Hola Jadder,

On 3/13/2011 4:55 PM, Jadder Antonio Moya Urbáez wrote:
> Muchas gracia croe que ha sido la mejor ayuda, hay muchas cosas que
> tengo que analizar de las que me has dicho,.
>
> Tengo un lio entre char y string, si usaba switch( string ) me daba
> un error al no ser constante, y para resolver eso, tenia que pasar
> los valores en grupo de 3 al char, pero si usaba un char me daba
> error tenia que usar char[3], para que me aceptara el switch..
>
> bueno tendre pendiente todos tus puntos para aplicarlo.
>
> cual quier otras aclaraciones mejor :)
>

Bueno, pues te aclaro algunas cosas acerca del tema. En primer lugar, 
debes distinguir entre lo que ofrece el lenguaje y las bibliotecas 
estándares de ANSI C/C++.

En el lenguaje usamos un array de tipo 'char' para representar una 
cadena de caracteres, teniendo cuidado de guardar el carácter nulo, 
'\0', para indicar el final de la información; o sea, el final de la 
cadena. El lenguaje sólo sabe de las cadenas de caracteres literales, 
que son de tipo 'const char *'. Por ejemplo,

char szCadena[] = "Hola";

cout << szCadena << " Mundo" << endl;

En ANSI C++, podemos usar la clase estándar 'string' que se define en 
<string>. Esta clase sobrecarga algunos operadores, como [] para acceder 
a elementos, algunos de asignación, como = y +=, otros más como los de 
comparación. Por ejemplo,

string sCadena( "Hola" );
sCadena += " Mundo";

cout << sCadena << endl;

Hagas lo que hagas con estos objetos, siguen siendo objetos y por tanto, 
su definición y su funcionalidad depende de la biblioteca y no 
directamente del lenguaje.

En segundo lugar, creo que deberías mirar otra vez la sintaxis de 
'switch/case', que es,

switch ( <expresión_de_enteros> )
{
   case <expresión_constante_1>: <sentencia_1>
   case <expresión_constante_2>: <sentencia_2>
   ...
   default: <sentencia>
}

Como puedes ver, bajo cada 'case', lo que le sigue debe ser una 
expresión constante. Esto es porque el compilador debe conocer 
exactamente el valor de cada caso. Al usar un objeto, éste no es 
directamente un entero, pero aún así no existirían valores constantes 
conocidos por el compilador para los casos. Por ejemplo,

switch( sCadena )  // Incorrecto
{
   case string("Hola"):  ...
   case string("Mundo"):  ...
   ...
}

Tampoco tiene mucho sentido usar 'char *', ya que las cadenas literales 
serán direcciones de memoria. Por ejemplo,

char szCadena[64];
...
switch( szCadena )  // Incorrecto
{
   case "Hola":  ...
   case "Mundo":  ...
   ...
}

Al fin y al cabo, un array ES una dirección de memoria, por lo que cada 
caso se basa en una dirección diferente de memoria. Básicamente, estás 
comparando punteros y no los contenidos de las cadenas.


De todas maneras, lo que te interesa es comparar cada carácter. Esto lo 
puedes hacer tanto con objetos de la clase 'string' como con arrays de 
tipo 'char', en ambos casos usando el operador []. Por ejemplo,

switch( sCadena[0] )  // Correcto: seleccionamos en base a 'char'
{
   case 'H':  ...
   case 'M':  ...
   ...
}


Sugiero que consultes el capítulo 5 de sentencias:
http://c.conclase.net/curso/index.php?cap=005c#Se_switch

y los capítulos 8 y 10 para cadenas de caracteres y arrays en general:
http://c.conclase.net/curso/index.php?cap=008#inicio
http://c.conclase.net/curso/index.php?cap=010#inicio


Espero que esto te oriente.

Steven





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