Hola y bienvenido de nuevo. En En
esta conferencia, quiero hablar sobre la creación de una
cadena, específicamente cómo puede hacerlo en c usando una matriz de caracteres.
Tiendo a usar los términos cadena y cadenas de caracteres indistintamente.
Pero realmente una cadena de caracteres es la matriz de caracteres de la que vamos a hablar.
Es un concepto muy importante.
Ahora podremos utilizar palabras y texto en nuestro programa para hacer todo tipo de cosas.
Ahora c en sí mismo no tiene ningún tipo de datos que represente una cadena.
No hay nada ahí. Muchos lenguajes admiten un
objeto o un tipo de datos de tipo cadena.
Ahora que no hay ningún tipo de datos c en la cadena, no puede
usar ninguno de los operadores en la cadena.
Entonces, lo que terminaremos haciendo es terminar usando la biblioteca estándar y hay todo tipo de funciones
de cadena de las que vamos a hablar.
Tenemos tres conferencias dedicadas a las diversas funciones de cuerdas que puede emplear.
Y esto nos ayudará a manipular las cadenas, obtener información sobre las cadenas.
Pero no puede utilizar operadores en cadenas, sin cadenas de
más o menos, nada de eso.
Las cadenas en c se almacenan en una matriz de tipo char.
Sabemos qué es una matriz. Sabemos qué es un tipo char.
Un tipo char es un solo carácter, una matriz en la que
puede almacenar varios elementos con el mismo nombre.
Por lo tanto, tiene sentido que una cadena esté dentro de una matriz de
caracteres porque una cadena tiene muchos, muchos caracteres.
Entonces, los caracteres de una cadena se almacenan en celdas de memoria adyacentes, un carácter por celda.
Puede acceder a él del mismo modo que accede a una matriz.
Pero cómo declararía realmente una cadena y vería es que simplemente usaría el tipo char y luego
los corchetes para indicar el tamaño, al igual que una matriz normal si
tuviera que crearla de un tipo diferente.
Char y luego cualquiera que sea su nombre y luego el tamaño
de la matriz de caracteres entre corchetes.
Así es como puedes declarar una cadena en c.
Ahora, cuando declara la cadena en c de esta manera,
no hay datos reales asociados con. Solo estás especificando el tamaño.
Esa es la forma más sencilla.
Entonces, la variable puede acomodar una cadena que contenga hasta 19 caracteres.
Recuerda este carácter nulo.
Si dice que el tamaño de su cadena será 20, eso significa que
solo se pueden almacenar 19 caracteres
porque debe tener ese carácter adicional para el nulo.
Tenga esto en cuenta, declarar que una matriz de caracteres tiene 20 significa
que se pueden almacenar 19 caracteres allí.
Cuando especifica la dimensión de una matriz que desea usar antes de una cadena, para almacenar
una cadena, debe ser
al menos uno mayor que el número de caracteres de la cadena que desea almacenar.
El compilador agregará automáticamente el terminador nulo al final de cada constante de cadena.
Entonces, lo que realmente debe hacer es cuando
crea estas cadenas de caracteres, debe inicializarlas.
Por lo tanto, puede inicializar una variable de cadena del mismo modo que puede inicializar una matriz.
Pones cada carácter dentro de estos corchetes.
Entonces, esto se ve muy similar a si tuviera que inicializar elementos en una matriz de enteros.
Pero si dices char word y luego dentro
de los corchetes, pones cada carácter que crearía
una matriz de caracteres.
Entonces es lo mismo que cualquier otra inicialización de matriz.
En ausencia de poner el tamaño, el
compilador c calcula automáticamente el número de elementos en la matriz y luego agrega uno para el terminador nulo.
Por lo tanto, se basa en la cantidad de inicializadores que tiene
entre corchetes, llaves.
Esta declaración va a reservar espacio y memoria para exactamente siete
caracteres, el signo de exclamación
h-e-l-l-o y luego el terminador nulo, y este pequeño diagrama a la derecha lo muestra.
Automáticamente y agregando ese terminador nulo. Ahora sería realmente un
dolor de cabeza si siempre tuviera que
inicializar sus matrices de caracteres con comillas simples seguidas de comas.
Entonces, lo que puede hacer es incluso la notación taquigráfica, es decir, puede poner comillas dobles alrededor de eso.
Entonces, puede especificar la cadena explícitamente, como en el primer ejemplo, y
luego tendría que usar una función de cadena solo
para aplicarle datos o
puede dejar que el compilador lo haga por usted.
El problema de hacerlo explícitamente es que siempre debes recordar agregar ese carácter adicional
para el nulo.
Entonces, lo que realmente debe hacer es dejar que el compilador lo resuelva por usted.
Así que no pongas ningún número dentro de esos corchetes para el tamaño.
Porque si el tamaño especificado es demasiado pequeño, el compilador no puede caber en
el carácter nulo de terminación al final de la matriz y no pone uno allí
y no le dirá que no puso uno allí.
Entonces vas a tener un error en tu programa y ni siquiera lo vas a saber.
La mejor práctica es cuando está utilizando un literal de cadena
y está inicializando una cadena para permitir que el compilador determine el tamaño por usted.
Hágalo de un tamaño más grande o algo así y luego colóquelo allí y determinará el tamaño para usted.
Así que no especifiques el tamaño. Deje que el compilador lo resuelva.
De esta manera, puede estar seguro de que será correcto.
Simplemente deje esos corchetes como corchetes vacíos
y asígnelo con el operador de asignación y luego, entre
comillas dobles, simplemente puede ponerlo. Ni siquiera necesitas los corchetes.
Ésta es la mejor práctica. Veremos un ejemplo.
También puede inicializar solo parte de una
matriz de elementos de tipo char con una cadena.
Entonces, si realmente creó un tamaño que era realmente grande y
solo asignó un par de caracteres, también está bien,
solo está inicializando algunos de los caracteres. Todos los demás personajes
estarán vacíos.
Entonces, lo que sucederá aquí es que el compilador inicializará los primeros cinco elementos.
De cero a cuatro, todos esos caracteres
de cadena constante y luego la cadena sub 5 contendrán
el carácter nulo.
Todavía se asignará espacio para los 40 elementos
de la matriz, pero solo se usarán cinco de ellos, cuatro más el carácter nulo.
Entonces, nuevamente, su mejor práctica en realidad no especifica un número dentro del
tamaño, simplemente asígnele un literal de cadena con comillas dobles.
Eso es lo que vas a terminar viendo.
Ahora bien, si no inicializó y acaba de crear la
matriz de caracteres con un tamaño, ¿cómo le pone la fecha?
Bueno, debido a que es una matriz, no puede simplemente asignar datos.
Sabemos que si tuviéramos una matriz de enteros, no podemos
simplemente asignarle el número cinco a una matriz de
enteros, no tiene sentido. Tienes que especificar los elementos reales.
Tienes que especificar los índices.
Entonces, no puede hacer algo como declarar una matriz de caracteres con 100 caracteres y luego decir
s es igual a hola. Eso no va a funcionar.
Porque, de nuevo, s es una matriz. Aunque es una cadena entre comillas dobles, sigue siendo una matriz en la memoria.
Entonces, si está realizando una operación de asignación, no puede asignar una
matriz de caracteres a otra matriz de caracteres como la anterior.
Si desea asignar datos a una
matriz de caracteres después de haberla declarado y después de haberla inicializado,
debe usar una función especial llamada str copy.
Y hablaremos de eso en otra conferencia.
Entonces, hasta este punto, cuando cree sus cadenas, serán literales de
cadena, estarán entre comillas dobles y nunca las modificará.
Así que esto también es perfectamente válido. De hecho, podría acceder a estos
caracteres o cada elemento de la matriz por el índice y especificar cada carácter.
Entonces s sub 0, s sub 1 y luego ponga un solo carácter entre comillas simples.
Podrías asignarlo de esa manera. Pero imagina si tuvieras una cadena de 100 bytes.
Esto va a necesitar muchas líneas de código. Entonces no quieres hacer eso.
Lo que querrá hacer es inicializarlo cuando lo
declare sin tamaño y luego especificar si
alguna vez desea modificarlo que copia.
En cuanto a mostrar una cadena como salida, todavía usaremos esa función printf.
Cuando desee hacer referencia a una cadena en cualquier parte de su programa, simplemente use el nombre
de la matriz por sí mismo.
No es necesario especificar índices.
Porque los índices dentro de la matriz especificarán un solo carácter.
Si desea la cadena completa, simplemente use el nombre de la matriz.
Entonces, si está utilizando la función printf para mostrar la
salida, simplemente haría lo siguiente. Dentro de las comillas dobles,
usaría un porcentaje s como su especificador de formato y luego solo el nombre de la matriz de caracteres.
Por lo tanto, no lo trata como a otras matrices cuando desea acceder a él. Cuando desee acceder a él, solo el nombre,
sin índices ni corchetes reales.
Y el porcentaje como especificador de formato es para generar
una cadena terminada en nulo. Recuerde que antes de usar el porcentaje d para
los números enteros, puede usar el porcentaje c para los caracteres.
Para las cadenas, usa porcentajes, y esos son matrices de caracteres.
Espera alguna cadena terminada en nulo.
Entonces, sin embargo, inicializa la cadena si lo hizo sin tamaño y el
terminador nulo se agrega automáticamente o
si lo creó con un tamaño específico y lo agregó o si
lo agregó explícitamente, no importa. Solo tiene que tener una terminación nula.
La función printf asume que uno encuentra el especificador de formato percent s
que el argumento correspondiente es una cadena de caracteres que termina con un carácter nulo.
Eso es lo que espera, así que tiene que ser así.
Para ingresar una cadena, sabemos cómo ingresar otros
conjuntos de datos a través del teclado usando scanf.
Haremos lo mismo para ingresar cadenas.
Usaremos una función scanf. Con la función scanf, será
de la misma manera, excepto que usará un especificador de formato diferente.
Entonces, para las cadenas, usará un porcentaje s como entrada.
Y eso se usa para ingresar una cadena.
La otra cosa a tener en cuenta aquí es que no hay un signo comercial para el nombre
de la variable porque es un carácter. Recuerde, mencionamos que solo debe proporcionar el
signo comercial y la dirección del operador en las cadenas.
La razón es que cuando hablemos de punteros será más claro.
Pero la entrada de caracteres, aunque es una
matriz de caracteres, es un puntero, y scanf como segundo argumento toma un puntero.
Y es por eso que no tienes que hacerlo. Cuando declaras números enteros y dobles, esos no
son punteros y. Entonces, si
desea leer la entrada desde el teclado usando scanf, el segundo argumento espera un puntero
que debe pasar en una dirección.
Ahora con el scanf cuando haces
una cadena, scanf solo leerá hasta el espacio.
Entonces, si haces scanf y escribes, Jason
es un instructor.
Lo único que se almacenará en la entrada es Jason. Porque una vez que llegue
a ese espacio, no leerá el resto de la cadena.
Entonces, hay otras funciones que puede usar para leer la cadena completa.
Algunos de los ejemplos que vamos a utilizar probablemente lo hagan. Puede hacer cosas como f get s,
que es otra forma de leer la entrada desde el teclado y que leerá la cadena
completa independientemente de los espacios.
Pero hay otro que creo que se llama
get guiones bajos para C11,
pero hablaremos más de eso, pero eso es solo una cosa
para recordar cuando lee la entrada para cadenas. Solo se leerá hasta el espacio.
¿Qué tal probar si dos cadenas son iguales?
Bueno, hasta este punto, hemos probado todas las
variables para ver si son iguales, solo usamos es igual a igual.
Pero con cadenas, esto no va a funcionar.
El operador de igualdad, recuerde, dijimos que las cadenas son matrices de caracteres, por lo que no puede usar operadores en ellas.
Y el operador de igualdad solo se puede aplicar a ints y
dobles o flotantes o caracteres.
No funciona en estructuras o matrices. No se pueden comparar dos matrices.
Entonces no va a funcionar con cadenas. Si desea determinar si dos cadenas son
iguales, debe comparar explícitamente las dos cadenas de caracteres carácter por carácter.
Por lo tanto, tendría que mirar cada elemento en el índice
de la matriz por índice.
Sin embargo, eso es realmente un gran problema porque sería realmente tedioso.
Entonces, vamos a hablar sobre cómo puede hacerlo muy fácilmente
usando una función de comparación de str de la biblioteca estándar, pero
no puede usar los iguales a iguales, recuerde eso.
Y nuevamente, solo como recordatorio, lo he dicho un par de veces, quiero decirlo nuevamente,
la constante de cadena x entre comillas dobles
no es lo mismo que la constante de carácter x entre comillas simples.
X entre comillas simples es un tipo básico, es solo char
o cuidado.
X entre comillas dobles es un tipo de unidad, es una matriz de tipo char.
La X dentro de las comillas dobles realmente consta de dos caracteres, la
x y el terminador nulo, el carácter nulo, así que téngalo en cuenta.
Aquí hay un
ejemplo de cómo podemos crear cadenas, ya
sea declarándolas con un tamaño o inicializándolas en la misma línea.
Ahora bien, esta es la mejor práctica. Si va a usar cadenas literales, lo
que haría es hacer
lo que dice aquí, crear la matriz de caracteres, no especificar un
tamaño y luego, a la derecha del operador de asignación, tener comillas dobles.
El compilador creará automáticamente la cadena correcta y le agregará un terminador nulo.
Si especifica un tamaño y luego no tiene suficientes caracteres, no lo almacenará.
Así que simplemente cree literales de cadena de caracteres
utilizando el tipo de datos char, el
nombre de la variable y luego los corchetes vacíos.
Creo que este programa contará los caracteres en una
matriz, por lo que esencialmente obtendrá la longitud de la cadena.
Lo que estamos haciendo aquí es que estamos creando una variable llamada count en dos matrices
de caracteres con dos cadenas diferentes, ser o no ser y
luego coma, esa es la pregunta.
Char str one va a tener un alternador después de b, y str
va a tener una alternativa después de la pregunta.
Así que tenemos un ciclo aquí que va a pasar por
la primera matriz, desde el recuento es igual a cero hasta que veamos un terminador nulo.
Y podemos usar los no iguales en este caso porque estamos comparando un personaje.
Terminator nulo como personaje. Está perfectamente bien comparar personajes.
Entonces, nuestro bucle while se extenderá hasta el final hasta que veamos un terminador nulo.
Una vez que veamos un terminador nulo, saldremos.
El recuento será igual al número de caracteres de esa cadena.
Entonces es la longitud de esa cuerda.
Lo hacemos para ambas cuerdas. Y notarás que básicamente ambas
cadenas tendrán la longitud correcta porque solo estamos revisando cada una.
Para bo no para b va a tener algo así
como 18 caracteres.
Ahora nunca necesitará hacer algo como esto porque tenemos
una función de ayuda agradable con str length para encontrar longitudes de cadenas.
Pero nuevamente, lo que esto demuestra es el hecho de que es una matriz.
Y si desea comparar o encontrar la longitud de una cadena, puede usar
el no es igual y mirar el carácter, el terminador nulo.
Espero que esto haya sido de ayuda. Así es como vamos a definir e inicializar cadenas literales.
Gracias.