¡Aprende Cómo Declarar y Manipular Variables de Cadena en CodeBlocks para C/C++ Fácil y Rápido!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Cuando se estudiaron los tipos de datos definidos en C, se pudo observar que el lenguaje C sólo define datos de tipo entero y de punto flotante. Una variable definida de tipo char, sin embargo, alberga números enteros entre -128 y 127 y no caracteres como lo hacen otros lenguajes como el Pascal. Esto se da porque un programa en C/C++ se redacta en un editor de palabras, por lo tanto todo lo que se escribe en el editor son secuencias de caracteres. Es el compilador el que interpreta estos caracteres y los almacena en la memoria como representaciones binarias. Es por esta razón que una expresión puede darse de esta manera a = 'A' + 32;, no es que se pretenda sumar el valor de 32 a la letra A, sino que se está sumando 32 al valor numérico que este carácter representa.

Nosotros vamos a trabajar con C por lo que habremos de declarar e inicializar las variables que usemos siempre. El lenguaje C obliga a declarar una variable antes de ser usada. Declarar una variable no significa que se le asigne contenido, sino simplemente se indica que la variable existe. En C no está permitido usar una variable sin antes haberle asignado un contenido, a lo que se denomina “inicializar la variable”. Por tanto, al tratar de ejecutar un programa donde una variable está sin inicializar puede producirse un error de compilación. Conociendo ya los tipos de variables básicas y cómo nombrarlas, la declaración de variables en C debe hacerse al principio del programa.

Definición de Cadenas de Caracteres en C

Una peculiaridad de C respecto a otros lenguajes es que no tiene un tipo predefinido “String” o cadena de caracteres. En este sentido podemos definir una cadena de caracteres en C como un arreglo en el que cada elemento es de tipo char. C++ guarda las cadenas de caracteres en un arreglo del tipo char que termina con un caracter nulo (NULL).

Los caracteres de una cadena se colocarán uno a continuación del otro en los elementos del arreglo, a partir del primero. Para saber dónde terminan los caracteres válidos en el arreglo, se debe colocar un valor de terminación al final de la secuencia de caracteres; este valor es cero, que representa al carácter cuyo código ASCII es cero. Este final se representa utilizando un carácter NULL (NULO), que C++ representa con el caracter especial “\0”. Esta forma de manipular las cadenas de caracteres trae muchas ventajas en comparación de la forma en que lo hacen otros lenguajes de programación. Por ejemplo en Pascal, la longitud de las cadenas de caracteres se almacena en la misma representación, al inicio de la secuencia de caracteres.

Por lo tanto, para declarar una cadena de caracteres simplemente se declara un arreglo de tipo char con los suficientes elementos como para contener los caracteres deseados. Están formadas por una sucesión de caracteres terminada con un carácter nulo (\0), de modo que tendremos que reservar una letra más de las que necesitamos. Este carácter nulo lo utilizarán todas las órdenes estándar que tienen que ver con manejo de cadenas: las que las muestran en pantalla, las que comparan cadenas, las que dan a una cadena un cierto valor, etc.

Lea también: IVA 21% Excel

Un ejemplo de declaración es char nombre[20];, donde "nombre" es una cadena de caracteres que puede albergar hasta 19 caracteres, no olvidar que se requiere un espacio para el delimitador de la cadena (cero o '\0'). Como ya se ha visto para los arreglos, si no se especifica el tamaño de la cadena, el compilador de C++ asignará la suficiente memoria como para contener las letras especificadas, más el caracter NULL.

Inicialización de Cadenas de Caracteres

Como cualquier arreglo, una cadena de caracteres se puede inicializar en el momento de su declaración. C++ permite inicializar las variables en el momento de su declaración. Lo mismo puede hacerse con un arreglo, especificando los valores iniciales colocándolos entre llaves.

Por ejemplo:

  • char nomb2[10] = {'H', 'o', 'l', 'a', '\0', '+', '\t', '{', '\n', 'A'};
  • char nomb4[10] = "Hola";

Si recordamos de los arreglos, si se colocan menos valores de inicialización que la capacidad del arreglo, el resto de elementos del arreglo se inicializa en cero. Cuando se asignan caracteres a la cadena, se debe poner el caracter null después del último elemento. Pero cuidado con este último formato: hay que recordar que sólo se puede usar cuando se declara la variable, al principio del programa.

Asignación de Valores a Cadenas

Asignar un valor a una variable en un programa quiere decir que colocaremos un valor en la posición de memoria relacionada con la variable. Cuando se hacen operaciones de asignación se emplean por lo general valores constantes, variables o expresiones. En el caso de las cadenas de caracteres, no se puede asignar valores como se hacen con las variables numéricas. La razón de esto es la forma como se definen las cadenas en C, mediante arreglos.

Lea también: Guía IVA reducido

Esto se debe a que, como dijimos en el capítulo de arreglos, cuando en un programa se emplea el identificador del arreglo sin colocar un índice entre corchetes, se estará haciendo referencia a la dirección de memoria del inicio del área de datos del arreglo. Por otro lado, un valor constante dado para una cadena de caracteres se representa como una secuencia de caracteres encerrados entre comillas, por ejemplo: "Cadena", "Juan Perez Castro". Luego el compilador reemplaza el valor constante por la dirección de inicio del área asignada.

Cuando queremos dar a una variable el valor de otra, normalmente usamos construcciones como a = 2, o como a = b. Pero en el caso de las cadenas de texto, esta NO es la forma correcta, no podemos hacer algo como saludo="hola" ni algo como texto1=texto2. Si hacemos algo así, haremos que las dos cadenas estén en la misma posición de memoria, y que los cambios que hagamos a una de ellas se reflejen también en la otra. La pregunta ahora es ¿cómo hacer la asignación? La respuesta a esto es sencilla aunque no es tan inmediata como una asignación simple, habrá que elaborar una rutina que permita asignar carácter a carácter los elementos de un arreglo al otro.

Una rutina manual de asignación podría operar de la siguiente manera: Los punteros destino y origen apuntan inicialmente al primer elemento del arreglo respectivo. El origen en el primer carácter de la cadena destino. Luego se aplica el operador ++, que está como sufijo, a destino y a origen (no se aplica a *destino ni a *origen por la forma como se agrupa el operador), por lo que cada puntero termina apuntando al siguiente caracter de la cadena. Al encontrar el caracter de terminación, que es un valor cero, el ciclo se detiene. Esto último quiere decir que no se necesita dar una orden adicional para asignar el caracter de terminación a la cadena destino.

Es decir, debemos usar una función llamada “strcpy” (string copy, copiar cadena), que se encuentra también en “string.h”. Es nuestra responsabilidad que en la cadena de destino haya suficiente espacio reservado para copiar lo que queremos. Si no es así, estaremos sobreescribiendo direcciones de memoria en las que no sabemos qué hay. Tras la ejecución de este mandato, “nombre1” contendrá “Margarita” pero sin las dobles comillas, que son sólo para el compilador (así sabe que estamos definiendo una cadena).

Lectura y Escritura de Cadenas de Caracteres

El lenguaje C/C++ implementa una serie de funciones que permiten el ingreso y la salida de cadenas de caracteres a, y desde, un programa.

Lea también: ¿Cómo localizar tus XML del SAT?

  • scanf: La función scanf, como lo indicamos en capítulos anteriores, permite el ingreso de datos desde la consola. Esta misma función, empleando el especificador de formato %s, permite el ingreso de cadenas de caracteres. La función scanf irá tomando uno a uno los caracteres del buffer de entrada, y los irá colocando consecutivamente en el arreglo a partir del primer elemento. Si la cadena contiene espacios, se lee sólo hasta el primer espacio. La función scanf también se puede emplear con punteros, sin embargo se debe tener especial cuidado en el sentido de asegurar antes que el puntero apunte a una dirección válida. Se denomina "conjunto de exploración" a una lista de caracteres que se coloca en la cadena de formato de la función scanf y permite restringir los caracteres que se pueden ingresar a una cadena de caracteres. También se puede negar un conjunto, de modo que se permita cualquier caracter menos los contenidos en el conjunto. Esto se logra poniendo el caracter ^ al inicio del conjunto.
  • printf: La función printf permite, empleando el especificador de formato %s, la impresión del contenido de un arreglo de tipo char, como caracteres en la consola. La función irá tomando cada uno de los elementos del arreglo e irá mostrando en la pantalla cada uno de los caracteres correspondientes, hasta encontrar el delimitador de la cadena (0 ó '\0').
  • gets y puts: Otro par de funciones que permiten el ingreso y la salida de cadenas de caracteres son las funciones gets y puts. La función gets recibe como parámetro un arreglo de tipo char, en él se almacenarán los caracteres provenientes de la consola. A diferencia de printf, la lectura con gets no se detendrá cuando se encuentre un espacio en blanco sino hasta encontrar un caracter de cambio de línea. La función puts es equivalente a scanf con la diferencia que cuando puts termina de imprimir los caracteres, envía a la pantalla un carácter de cambio de línea.
  • cin, cout y getline (C++): Finalmente se pueden emplear los objetos cin y cout. También existe un método asociado a cin que permite realizar una operación similar a gets, este método se denomina getline, donde "cad" es una cadena de caracteres y n es la cantidad máxima de caracteres menos uno, que se podrá leer desde el buffer de entrada.

Funciones de Manipulación de Cadenas (Biblioteca string.h)

Todos los compiladores de C implementan una biblioteca de funciones que permite, de una manera sencilla, la manipulación de cadenas de caracteres. Estas funciones trabajan con las cadenas de la misma manera que lo hemos hecho en este capítulo, es decir manipulando carácter por carácter cada uno de los elementos del arreglo. El archivo string.h contiene muchas funciones para manipular cadenas. C++ utiliza el caracter NULL para indicar el final de una cadena. Para que la función trabaje con el arreglo se debe especificar su tipo, no necesariamente su tamaño. No se tiene que especificar el tamaño de la cadena.

A continuación, se presenta una tabla con algunas de las funciones más comunes para la manipulación de cadenas de caracteres:

Función Descripción
strlen(cad) Devuelve el número de caracteres de la cadena "cad". No cuenta el caracter de terminación.
strcpy(destino, origen) Copia todos los caracteres de la cadena origen en la cadena destino, incluso el caracter de terminación. Devuelve un puntero a destino.
strcmp(cad1, cad2) Compara uno a uno los caracteres de ambas cadenas hasta completarlos todos o hasta encontrar una diferencia. Devuelve cero (0) si ambas cadenas son iguales, un valor negativo si la primera cadena es menor que la segunda y un valor positivo si la primera es mayor que la segunda.
strcat(destino, origen) Agrega una copia de la cadena origen al final de la cadena destino. Devuelve la dirección a la que apunta la variable destino.
strstr(cad1, cad2) Busca la primera ocurrencia de la cadena "cad2" en la cadena "cad1". Si la encuentra, devuelve un puntero que apunta al primer caracter de la ocurrencia en "cad1"; si no lo encuentra, devuelve NULL.
strchr(cad, c) Busca la primera ocurrencia del caracter contenido en la variable "c". Si lo encuentra, devuelve un puntero que apunta al caracter encontrado en "cad"; si no lo encuentra, devuelve NULL.
strrchr(cad, c) Busca la última ocurrencia del caracter contenido en la variable "c". Si lo encuentra, devuelve un puntero que apunta al caracter encontrado en "cad"; si no lo encuentra, devuelve NULL.
strspn(cad1, cad2) Busca la primera ocurrencia de cualquier caracter de la cadena "cad2" en la cadena "cad1". Si la encuentra, devuelve un puntero que apunta al caracter encontrado en la cadena "cad1"; si no lo encuentra, devuelve NULL.
strupr(cad) Convierte las letras contenidas en la cadena "cad" en mayúsculas. Devuelve un puntero a la cadena "cad".
strlwr(cad) Convierte las letras contenidas en la cadena "cad" en minúsculas. Devuelve un puntero a la cadena "cad".
strrev(cad) Invierte los caracteres contenidos en la cadena "cad". Devuelve un puntero a la cadena "cad".

La primera diferencia en la comparación de cadenas es que se distingue entre mayúsculas y minúsculas. Para más detalles, en el código ASCII las mayúsculas aparecen antes que las minúsculas, así que las palabras escritas en mayúsculas se consideran “menores” que las palabras escritas en minúsculas.

Cadenas de Caracteres en C++ Moderno

C++ admite varios tipos de cadenas y caracteres, y proporciona maneras de expresar valores literales de cada uno de esos tipos. En el código fuente, el contenido de los literales de carácter y cadena se expresa mediante un juego de caracteres. Los nombres de carácter universal y los caracteres de escape permiten expresar cualquier cadena con tan solo el juego básico de caracteres de código fuente.

Literales de Carácter

Un literal de carácter está compuesto por un carácter de constante. Se representa mediante el carácter delimitado por comillas simples. El carácter que se usa para un literal de carácter puede ser cualquier carácter, a excepción de los caracteres reservados como la barra diagonal inversa (\), las comillas simples (') o la nueva línea. Los caracteres reservados se pueden especificar mediante una secuencia de escape.

Un literal de carácter sin prefijo es un literal de carácter normal. Al examinar los programas de C++ podemos ver caracteres contenidos dentro de apóstrofes (Ej: ‘A’) y caracteres dentro de comillas (“A”). Un caracter que está entre apóstrofes es un caracter constante. El compilador de C++ solamente asigna un byte de memoria para guardar un caracter constante.

  • Un literal de carácter que comienza con el prefijo L es un literal de caracteres anchos.
  • Un literal de carácter que comienza con el prefijo u8 es un literal de caracteres UTF-8. C++20 presenta el tipo de carácter portátil char8_t (Unicode codificado con UTF-8) de 8 bits.
  • Un literal de carácter que comienza con el prefijo u es un literal de caracteres UTF-16.
  • Un literal de carácter que comienza con el prefijo U es un literal de caracteres UTF-32.

Secuencias de Escape

Hay tres tipos de secuencias de escape: simple, octal, hexadecimal. Una secuencia de escape octal es una barra diagonal inversa seguida de una secuencia de uno a tres dígitos octales. Una secuencia de escape octal finaliza en el primer carácter que no es un dígito octal, si se encuentra antes que el tercer dígito. Una secuencia de escape hexadecimal es una barra diagonal inversa seguida del carácter x y seguida de una secuencia de uno o varios dígitos hexadecimales. Los ceros a la izquierda se ignoran. En un literal de carácter estrecho sin prefijo o con prefijo u8, el valor hexadecimal máximo es 0xFF. En un literal de carácter ancho con prefijo L o prefijo u, el valor hexadecimal máximo es 0xFFFF. Si quiere que un carácter de barra diagonal inversa aparezca como un literal de carácter, debe escribir dos barras diagonales inversas en una fila (\\).

Nombres de Carácter Universal

En los literales de carácter y los literales de cadena nativa (con formato), se puede representar cualquier carácter mediante un nombre de carácter universal. Los nombres de carácter universal se forman con un prefijo \U seguido de un punto de código Unicode de ocho dígitos o con un prefijo \u seguido de un punto de código Unicode de cuatro dígitos. En C++11, tanto los literales de carácter y cadena como los identificadores pueden usar nombres de carácter universal.

Literales de Cadena

Un literal de cadena representa una secuencia de caracteres que, en conjunto, forman una cadena terminada en null. Los caracteres deben escribirse entre comillas.

  • Un literal de cadena estrecho es una matriz sin prefijo, delimitada por comillas dobles y terminada en null del tipo const char[n], donde n es la longitud de la matriz en bytes. Un literal de cadena estrecho puede contener cualquier carácter gráfico, excepto las comillas dobles ("), la barra diagonal inversa (\) o el carácter de nueva línea (\n).
  • Una cadena con codificación UTF-8 es una matriz con prefijo u8, delimitada por comillas dobles y terminada en null del tipo const char[n], donde n es la longitud de la matriz codificada en bytes. Un literal de cadena con prefijo u8 puede tener cualquier carácter gráfico, excepto las comillas dobles ("), la barra diagonal inversa (\) o el carácter de nueva línea (\n).
  • Un literal de cadena ancho es una matriz terminada en null de valores wchar_t constantes que lleva el prefijo 'L' y que contiene cualquier carácter gráfico excepto las comillas dobles ("), la barra diagonal inversa (\) o el carácter de nueva línea.
  • Un literal de cadena sin formato permite evitar la utilización de caracteres de escape y puede usarse para expresar todos los tipos de literales de cadena. Un literal de cadena sin formato es una matriz terminada en null (de cualquier tipo de carácter) que contiene cualquier carácter gráfico, incluidas las comillas dobles ("), la barra diagonal inversa (\) o el carácter de nueva línea. Los literales de cadena sin formato suelen usarse en expresiones regulares que utilizan clases de caracteres, y en las cadenas HTML y XML. Un delimitador es una secuencia definida por el usuario de hasta 16 caracteres que precede inmediatamente al paréntesis de apertura de un literal de cadena sin formato, y sigue inmediatamente a su paréntesis de cierre. Por ejemplo, en R"abc(Hello"\( )abc" la secuencia de delimitador es abc y el contenido de la cadena es Hello"\(. Puede usar un delimitador para eliminar la ambigüedad de las cadenas sin formato que contienen comillas dobles y paréntesis.
  • Los literales std::string son implementaciones de la biblioteca estándar de literales definidos por el usuario que se representan como "xyz"s (con un sufijo s). Este tipo de literal de cadena produce un objeto temporal de tipo std::string, std::wstring, std::u32string o std::u16string según el prefijo que se especifique. Cuando no se usa ningún prefijo, se genera un std::string. L"xyz"s genera un std::wstring. Los literales std::string se definen en el espacio de nombres std::literals::string_literals del archivo de encabezado <string>.

Los literales de cadena anchos o estrechos adyacentes se concatenan. Los literales std::string (y los relacionados std::u8string, std::u16string y std::u32string) se pueden concatenar con el operador + definido para los tipos basic_string. También pueden concatenarse de la misma manera que literales de cadena adyacentes.

tags: #como #declarar #variable #en #codeblocks #de