elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Constantes de carácter y constantes de cadena de carácteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Constantes de carácter y constantes de cadena de carácteres  (Leído 2,979 veces)
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
[Solucionado] Constantes de carácter y constantes de cadena de carácteres
« en: 19 Febrero 2012, 15:19 pm »

Hola a todos,

llevo tiempo con una duda que no doy resuelto:

Las constantes de carácter es un carácter encerrado entre comillas simples, que se puede representar por un valor numérico segun la tabla ASCII.

Las contantes de cadena de carácter es un número cualquiera de caracteres consecutivos encerrados entre comillas dobles. He leído que llevan un caracter nulo al final que indica el fin de la cadena, "\0".

Estaba probando la función:

Código

Convierte una letra a mayúscula, tengo este código:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. char i = 'a';
  6. printf("%c", toupper(i));
  7.  
  8. return 0;
  9. }

Y el resultado es: "A", perfecto.

Con este código:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. char i = "a";
  6. printf("%c", toupper(i));
  7.  
  8. return 0;
  9. }

El resultado es "D", no entiendo porque. Creía que tenia entendida la diferencia entra las dos pero veo que no. Querría saber porque pasa esto.

Saludos


« Última modificación: 22 Febrero 2012, 11:35 am por |Demon| » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Constantes de carácter y constantes de cadena de carácteres
« Respuesta #1 en: 19 Febrero 2012, 15:56 pm »

Los caracteres literales son una forma mas fácil de indicar un entero de tipo "signed int", por ejemplo 'A' en lugar de 65.

Las cadenas literales como "Hola" se almacenan en memoria y cuando se utilizan (salvo ciertas excepciones) resultan en la dirección en memoria del primer elemento del array (se consideran arrays de caracteres).

Tu problema se encuentra en la linea:
Código
  1. char i = "a";
Ya que en buen cristiano se puede traducir a "Tómese la dirección en memoria del array indicado y almacenese en la variable en cuestión". Después tratas de imprimir la dirección (mas bien lo que se pudo almacenar de ella en un carácter) y por ello el resultado.

Un saludo


En línea

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
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Constantes de carácter y constantes de cadena de carácteres
« Respuesta #2 en: 19 Febrero 2012, 17:30 pm »

Entiendo todo, hasta que dices donde está el error. Ya sabía que el error estaba ahí, solo quiero saber porque ocurre eso y no entendido lo que has dicho  :-X
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Constantes de carácter y constantes de cadena de carácteres
« Respuesta #3 en: 20 Febrero 2012, 15:37 pm »

Por partes.

Primero debo indicar que me equivoque con la explicación de la declaración, como dicen en mi rancho: "metí las patas" (las cuatro ;-) ).

----

Bueno, vamos a corregir eso. Cuando en la declaración de un array se utiliza una secuencia de caracteres delimitada por comillas dobles, por ejemplo:
Código
  1. char palabra[] = "hola";
Esa secuencia solo es una forma mas corta de indicar una lista de valores y la declaración anterior es equivalente a:
Código
  1. char palabra[] = {'h', 'o', 'l', 'a', '\0'};

En base a ello la declaración en tu programa:
Código
  1. char i = "a";
  2.  
  3. /* ==> */
  4.  
  5. char i = {'a', '\0'};
Es un error ya que una lista de valores solo puede utilizarse en la declaración de un agregado (una estructura o array) y la variable "i" no lo es.

----

Por otra parte en expresiones las secuencias de caracteres delimitadas por comillas dobles se conocen como "cadenas literales", estas secuencias se almacenan en algún lugar en memoria, su tipo es array de caracteres y si se trata de modificar una resulta en "comportamiento no definido" (cualquier cosa puede pasar).

Peor todavía, esas cadenas literales cuando se usan en una expresión tienen usualmente el mismo efecto que los arrays: resultan en la dirección en memoria del primer elemento de este.

Si todo eso te resulta complicado lo siento, el tema de los arrays y punteros es uno de los mas complicados en el lenguaje C.

Un programa demostrando lo anterior es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define CAD_EJEMPLO  "123456789"
  5.  
  6. int main(void)
  7. {
  8.   int i;
  9.  
  10.   printf("La cadena de ejemplo es \"%s\"\n", CAD_EJEMPLO);
  11.  
  12.   /* 1) Direccion donde se almacena la cadena literal */
  13.   printf("Direccion base: %p\n", (void *) CAD_EJEMPLO);
  14.  
  15.   /* 2) Espacio utilizado en memoria por la literal */
  16.   printf("Espacio utilizado: %lu\n", (unsigned long) sizeof CAD_EJEMPLO);
  17.  
  18.   /* 3) Literales iguales se almacenan en el mismo lugar? */
  19.   if (CAD_EJEMPLO == CAD_EJEMPLO)
  20.      puts("Misma ubicacion");
  21.   else
  22.      puts("Distinta ubicacion");
  23.  
  24.   /* 4) Impresion de cada uno de los caracteres de la literal */
  25.   for (i = 0; CAD_EJEMPLO[i] != '\0'; i++)
  26.      putchar(CAD_EJEMPLO[i]);
  27.   putchar('\n');
  28.  
  29.   return EXIT_SUCCESS;
  30. }

Un saludo
En línea

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
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Constantes de carácter y constantes de cadena de carácteres
« Respuesta #4 en: 20 Febrero 2012, 15:43 pm »

Gracias, ahora lo entiendo.

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
constantes
Programación Visual Basic
geel 1 1,054 Último mensaje 12 Junio 2006, 17:26 pm
por NYlOn
Constantes Hexedecimales
Programación Visual Basic
Yekka 2 1,148 Último mensaje 4 Noviembre 2007, 03:40 am
por HaDeS, -
[Solucionado] Separar una Cadena de Texto Caracter Por Caracter « 1 2 »
Programación Visual Basic
agus0 19 19,705 Último mensaje 5 Mayo 2011, 14:29 pm
por Psyke1
Convertir cada caracter de una cadena en una cadena independiente [SOLUCIONADO]
Programación C/C++
jazx 6 2,819 Último mensaje 12 Mayo 2015, 03:56 am
por x64core
Como imprimir una cadena de caracteres, caracter por caracter
ASM
Cachee38 1 2,490 Último mensaje 31 Octubre 2017, 13:34 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines