[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