Hola y bienvenido de nuevo. Otra emocionante conferencia. En esta lección,
hablaremos más sobre cadenas y funciones
de cadenas, principalmente la capacidad de buscar tokenizar y analizar cadenas.
Así que analicemos algunas funciones más de cadena. Buscando una cadena.
Buscando una cadena.
Todas estas funciones estarán en el encabezado de la cadena.
Hay algunas funciones de búsqueda de cadenas que son de uso
particular donde puede encontrar un carácter específico o una subcadena.
El nombre de esas funciones es strchr
y strstr.
Encontrar un solo carácter o subcadena dentro de una cadena.
Proporcionaremos algunos ejemplos de eso.
También hay algunas capacidades para tokenizar una cadena.
Puedes decir qué es tokenizar una cadena. Primero, debes definir qué es un token.
Un token es una secuencia de caracteres dentro de una cadena delimitada por un delimitador.
Un delimitador es algo que está en la cadena y que
nota que tiene un significado especial.
Entonces, un token sería si tuvieras una cadena completa, este
es Jason y está separada por espacios.
Una ficha podría ser esta, otra podría ser, otra podría ser Jason.
Es una forma de tomar una cadena completa y dividirla
en ciertos límites según un delimitador.
Y desea asegurarse de que su delimitador no
sea algo válido en la cadena real. Por lo tanto, también usa
delimitadores cuando lee archivos, el mismo tipo de concepto.
Cuando rompes una oración en palabras, eso se llama tokenización. Usaremos esta función
llamada strtok.
También quiero hablar sobre el análisis de cadenas. Hay un
montón de estos, muchos diferentes para verificar si
los caracteres son minúsculas o mayúsculas
o alfanuméricos o dígitos.
Estos se realizan principalmente en caracteres, pero los caracteres en cadenas laterales
y también puede aplicarlos a cadenas completas.
Ahora vamos a entrar en más detalles sobre las cadenas.
Y para comprender algunas de estas funciones, tenemos que hablar un poco sobre punteros.
Los punteros son un concepto enorme en c.
Vamos a tener una sección completa dedicada a los consejos.
Probablemente, el próximo o el siguiente.
Y es mucha discusión. Probablemente sea el tema más confuso del idioma.
No quiero repasar eso en detalle ahora mismo porque no es relevante.
Solo quiero tocarlo, solo darte un pequeño adelanto sobre lo que es un puntero para que
puedas entender algunas de estas funciones que vamos a usar.
Ese es el único propósito de esto. Entonces, si no comprende completamente los consejos
en este punto después de este par de diapositivas, no se preocupe.
Entonces, el concepto de puntero, nuevamente, lo discutiremos en detalle más adelante.
Pero para comprender algunas de estas funciones de cadena, quiero darle un vistazo rápido.
C proporciona un tipo de variable notablemente útil, se llama puntero.
He estado hablando de eso. Tiene que ver con la memoria y la asignación de memoria.
Algunos idiomas, si ha programado antes y no
es completamente nuevo en la programación, algunos idiomas administrarán automáticamente la memoria por usted.
Le asignarán memoria y la eliminarán, lenguaje como Java hace esto.
Se llama recolector de basura. Un lenguaje como c no hace esto.
Entonces, cada vez que crea memoria para usar
punteros, debe eliminar esa memoria.
Pero lo que es un puntero es muy útil
y lo que es es una variable que almacena una dirección.
Una dirección, recuerde, es algo en la memoria.
Suele ser hexadecimal.
El valor de la dirección está en otra ubicación de la memoria.
El puntero solo apunta a una dirección cuya dirección contiene un valor.
Y de hecho, hemos usado direcciones en el pasado con la función scanf.
Recuerde, ese símbolo comercial que hemos usado es la dirección del operador.
La función Scanf como segundo parámetro tendría
que tomar una variable en la que quisieras almacenar
los datos, esa variable tiene que ser un puntero.
Y entonces la función scanf esperaba un puntero.
Para crear un número entero por sí mismo, no es un puntero, pero
si obtiene la dirección del mismo, ahora se convierte en un puntero.
Entonces estamos usando el ampersand para obtener la dirección de un tipo de datos primitivo.
Entonces estás un poco familiarizado con el concepto de dirección.
Recuerde, a partir de ahora con punteros, crea
un número int y ese no es un
puntero y es igual a 25.
Pero si obtiene el signo comercial, que es la dirección, puede asignarlo a un puntero.
Un puntero tiene una sintaxis especial en c, el asterisco representa un puntero.
Entonces declaramos un número variable con el valor 25 y luego
declaramos un puntero usando el asterisco llamado pNumber, que
contiene la dirección del número.
Y nuevamente, el asterisco se usa para declarar el puntero, así es como se sabe
que es un tipo de datos de puntero.
¿Para obtener el valor de la variable p número
porque p número es qué? Es un puntero que apunta a una dirección en la memoria.
Si solo intenta ver el valor del número p, le dará la dirección.
Si desea obtener el valor de lo que apunta la dirección, debe eliminar la referencia.
Entonces, hay una sintaxis
especial que usa c, se llama asterisco y el nombre de la variable, así es
como puede acceder a la ubicación de memoria que contiene el valor.
Entonces, si desea asignar datos a esa ubicación de memoria, debe decir el número de estrella p.
Una vez más, el efecto es que accede a los datos almacenados en la dirección especificada por el puntero.
Así que se vuelve muy confuso cuando hablamos de punteros porque no estás acostumbrado a este concepto.
Crees que una variable tiene un valor, eso es todo. Pero una variable puede tener una dirección y
la dirección puede tener un valor.
Esta diapositiva intenta ilustrar lo que acabo de mencionar.
Encontré esto en un libro que leí.
Es una diapositiva que le muestra el concepto de un puntero en la memoria y
cómo funcionan las cosas con las direcciones.
Así que estoy reiterando lo que acabo de mencionar.
Pero el valor de ampersand number es la dirección donde se encuentra el número.
Entonces, si tiene dos variables, número y p
número, p número es un puntero, número es un int,
por cierto, también debe especificar el tipo de puntero.
Aunque el puntero es una
dirección, aún especifica el tipo o hacia dónde apunta la dirección.
Entonces int star p number va a ser igual a la dirección de number.
El número está en la memoria y apunta a
una dirección de mil, por ejemplo, y tiene un valor de 25.
El número P tiene una dirección de 105
para ese número p real, pero
el valor de esa dirección es 1000 direcciones.
Para obtener el valor del número p, tendría que desreferenciar el 1000, lo que
le dará 25.
La razón por la que menciono todo esto sobre
los punteros es que muchas funciones de cadena devolverán punteros.
Realmente no va a importar mucho.
Solo es importante cuando desea comprender cómo está obteniendo un cierto carácter dentro de una matriz.
Pero quería mencionarlos brevemente.
Está bien si el concepto no se asimila en este momento porque lo cubriremos con
un montón de detalles en una sección posterior.
Pero comprenda que las funciones de cadena que vamos a usar ahora devolverán punteros
y luego tal vez use ese retorno para hacer algo útil.
En el pasado, cuando usábamos las copias str y las comparaciones
str, pasábamos punteros pero nunca devolvía punteros, nunca tuvimos que usar ese puntero.
Ahora que tenemos que usar el puntero, solo quiero dar una pequeña descripción de lo que eso significa.
El puntero solo apuntará a una dirección.
Y luego puede usar esa dirección para hacer análisis o lo que sea que necesite hacer.
Así que, con suerte, esto no te abruma. Nuevamente, no se preocupe si no lo comprende completamente.
Ahora veremos algunos ejemplos
de análisis, tokenización y búsqueda de cadenas.
Para buscar una cadena, mencionamos, usará strchr o strstr.
El strchr busca un solo carácter en una cadena dada.
El primer argumento de la función es la cadena que se buscará,
que será la dirección de una matriz de caracteres.
El segundo argumento es el personaje que estás buscando.
Proporcionaremos un ejemplo en un segundo. Entonces, la función buscará la
cadena comenzando por el principio y devolverá
un puntero a la primera posición en la cadena donde se encuentra el carácter.
Es por eso que el puntero es importante ahora porque
no estamos devolviendo un valor completo, estamos devolviendo un puntero a
un carácter dentro de
una cadena y esa dirección representa el índice de una matriz, esencialmente.
Entonces, la dirección de esta posición en la memoria, es una estrella de carácter de tipo
y se describe como un puntero
a un carácter, que en realidad es solo un carácter en la memoria.
Para almacenar el valor que se devuelve, debe crear una variable que pueda almacenar la dirección de un carácter,
por lo que debe crear un puntero.
Si ahora se encuentra el carácter, la función devuelve un valor especial, que es nulo.
Nulo significa que el puntero no apunta a nada.
Usamos null cuando hablamos de punteros, y null
solo dice que no encontró nada. Entonces no apunta a nada.
Cuando apunta a algo, apunta a la dirección donde encontraste ese carácter y
luego puedes comenzar a analizar desde allí.
Porque recuerde de las lecciones
anteriores, cuando crea una matriz de caracteres en
la memoria, solo tiene cada carácter representado como un byte.
Y si está analizando una
cadena y desea ver dónde comienza un carácter en particular en esa cadena,
devuelve ese byte y luego puede comenzar a buscar desde allí.
Así que str char, cómo lo usas es esto.
Dices que creas una cadena de caracteres y la
inicializamos aquí con un rápido zorro marrón.
Luego creamos un solo carácter y lo inicializamos con q.
Luego creamos un puntero porque tenemos que crear un puntero porque eso es lo que devuelve el carácter str, eso es
lo que nos permite ver en qué parte de esa cadena encontramos un carácter.
Vamos a inicializar nuestro puntero a nulo. Porque ahora mismo no va a apuntar a nada.
Luego vamos a llamar str char, vamos a pasar nuestra cadena que es el zorro marrón rápido, y
vamos a pasar nuestro carácter único que es q.
Lo que va a pasar es que mirará dentro del veloz zorro marrón.
Y la primera vez que encuentre una q, devolverá la dirección de esa q.
Entonces p got char
realmente va a apuntar al cuarto índice de str.
Debido a que t es bajo cero, h es sub-uno, e es
sub-dos, el espacio es sub-tres, q es sub-cuatro.
Entonces p got char va a apuntar a q en el rápido zorro marrón.
Y para que pueda ver exactamente dónde comienza ese carácter en esa cadena.
Entonces, el primer argumento de str char es la dirección de la primera ubicación que se buscará, esa
es la cadena de búsqueda.
El segundo argumento es el personaje que se busca, el personaje que se quiere buscar,
un solo personaje.
Espera que el segundo argumento sea de tipo int.
Así que técnicamente str char, el segundo argumento lo asimila.
Pero el compilador c convertirá automáticamente el gráfico en un int.
Obtendrá el valor ASCII, esencialmente.
Entonces, en realidad, podría definir el carácter único
q en lugar de un solo carácter, podría definirlo como un int.
Eso es más un tecnicismo que quería que supieras.
Pero p got char apuntará al valor quick brown
fox porque comenzará en q y luego irá al terminador nulo si intenta imprimirlo.
Entonces, en realidad, será un zorro marrón rápido cuando ejecute este ejemplo.
Así es como puede buscar un solo carácter en una cadena completa.
Use str char, luego use el puntero y luego muestre el puntero.
¿Y cómo muestra ese puntero? De la misma manera que muestra otros caracteres, use printf, percent s.
Así que este es un buen mecanismo para buscar caracteres en una cadena completa.
Si desea buscar una cadena dentro de una cadena, que sería una
subcadena, use strstr.
Esta es probablemente la más útil de todas las funciones de búsqueda.
Busca en una cadena la aparición de una subcadena.
Y devuelve un puntero a la posición en la primera cadena donde se encuentra la
subcadena, muy similar a str char, pero busca una cadena completa. Si no encontró ninguna coincidencia, devuelve nulo.
El primer argumento es la cadena que se va a buscar como str char.
En segundo lugar, está la subcadena que está buscando, otra cadena. Así que aquí tienes un ejemplo.
Se parece mucho al otro, excepto que en lugar de buscar
un solo carácter, buscamos una palabra, una cadena.
Entonces tenemos palabra, que es igual a perro.
Y tenemos un texto que dice que cada perro tiene su día.
Creamos nuestro puntero nuevamente porque tiene que ser así; esto es lo que devuelve la función.
Cuando llamamos strstr, pasamos en el texto la cadena que queremos ver.
Y luego, el segundo argumento es la palabra que queremos buscar dentro de esa cadena.
Entonces buscará el texto la primera aparición de la cadena almacenada en word.
El perro de cadena aparece en el séptimo carácter del texto.
Si miras el texto.
El texto sub 6 va a ser igual a perro, ahí es donde comienza.
Entonces, el puntero apuntará a la dirección del texto más 6 perros,
y comenzará allí, y luego irá al terminador nulo.
Así que p encontrado va a ser un perro que tiene su día.
Y también tenga cuidado porque la búsqueda distingue entre mayúsculas y minúsculas.
Si en realidad proporcionó un D-O-G mayúsculo, no encontrará nada,
solo buscará el caso correcto.
Pero esto se usa para encontrar subcadenas y cadenas, muy útil porque
muchas veces en un programa dirás que esta cadena está dentro de esta
cadena porque es casi similar a un grep si alguna vez has usado grep en Linux.
Espero que esto tenga sentido. Tokenizando una cadena.
Un token es una secuencia de caracteres, uno de ellos cadena que está limitado por un delimitador, lo sabemos.
Un delimitador puede ser cualquier cosa, pero debería ser algo exclusivo de esa cadena.
No tenga un delimitador como "A" porque ahora encontrará en esa cadena
algo válido en una palabra.
Conviértalo en algo único como un espacio o una coma. Esto, nuevamente, se usa como límite para las
palabras usualmente en una sola cadena.
Entonces, rompe una oración en palabras, se llama tokenizar.
Esta función strtok se usa para tokenizar una cadena.
Requiere dos argumentos.
La cadena que se va a convertir en token, que es la cadena completa que tiene los espacios y los delimitadores.
Y luego la cadena que contiene todos los caracteres limitados positivos.
Puede especificar lo que desea establecer como límite.
Así que aquí tienes un ejemplo.
Estamos creando una matriz de caracteres 80.
Dice hola, ¿cómo estás? Tu eres Dash, mi nombre es Dash Jason.
Luego creamos una cadena constante que representa el delimitador, que es
el signo menos, el guión. Se ve un poco diferente, pero sigue siendo el menos, el
guión, ambos son guiones.
Y luego creamos nuestro puntero que es token.
Porque strtok devolverá cada uno
de nuestros tokens.
Entonces, si llamamos a nuestro strtok y pasamos
una cadena y pasamos nuestros delimitadores
s, el token será igual a lo primero que encuentre.
Entonces, la primera vez que llame a strtok, será igual a hola, ¿cómo
está su espacio y luego encontrará la coincidencia con el guión?
Y si llama por
segunda vez, se imprimirá mi nombre es.
Si lo llama por tercera
vez, imprimirá Jason porque está pasando por los guiones.
Por eso tenemos un ciclo while aquí. Decimos que si bien el token no es igual a
nulo, imprima el token.
Y luego obtenemos el siguiente token llamando a strtok.
Y decimos nulo como nuestro primer parámetro y
s es nuestro segundo parámetro
y luego mostramos. Así que veamos esto
en bloques de código, ya que lo hará más comprensible.
Así que construyamos esto. Pasamos por este ejemplo.
Quiero mostrarte cuál es el resultado, para que quede claro lo que está sucediendo aquí.
Entonces aquí verá que dice que imprime el
primer token que es hola, ¿cómo estás?
Bueno, lo primero que hace es
buscar la primera ficha, la imprime, hola cómo estás, mi nombre es y luego Jason.
Así que ahora tenemos hola cómo estás,
encuentra el primer guión, lo imprime. Mi nombre es encuentra el siguiente token y
luego el tercero es Jason. Pero tienes que llamar al
token tres veces para obtener cada token.
El primero se convertirá en token en el str.
Vea el siguiente que puede pasar en nulo porque no desea volver a mirar, solo desea obtener el siguiente token.
Y entonces pasas un nulo al segundo y simplemente pasas una s.
Te dará el siguiente token del str ya tok.
Así es como puedes usar strtok. Ayuda mucho con el análisis.
Puede analizar algo y eliminar ciertos límites.
Las últimas funciones de las que quiero hablar son estas funciones de cadena de análisis.
Hay un montón de ellos, así que solo proporcioné una pequeña mesa aquí.
Es inferior, es superior. Hace exactamente lo que crees que haría.
Prueba para ver si un carácter está en minúsculas o en mayúsculas.
Estamos probando ciertos caracteres, pero se usan dentro de cadenas.
Entonces, el argumento de cada una de estas funciones es el carácter que desea buscar.
Y luego todas estas funciones devuelven un valor distinto de cero de
tipo int si el carácter está dentro del conjunto que se está probando.
Así que vamos a pasar caracteres int adentro buscando palabras internas.
Si tenemos una letra mayúscula dentro de una palabra, nos lo dirá y
también podemos usarla para analizar elementos individuales en forma de caracteres.
Entonces, los valores devueltos se convertirán en verdadero o falso, por lo
que también puede usarlos como booleanos, lo cual es bueno.
Por lo tanto, es inferior devolverá verdadero
si una palabra o carácter tiene una letra minúscula.
Bueno, aquí hay un buen ejemplo que
quería repasar, que contará el número de dígitos de letras en una cadena completa.
Así que ejecutemos esto porque estará claro,
pero lo que debería notar es que estamos creando un
búfer, nuestro búfer de entrada y luego estamos creando tres enteros para contar.
Le estamos diciendo al usuario que ingrese una
cadena de menos de tantos caracteres, luego la leemos.
Luego, veremos esa cadena para ver
si contiene ciertos caracteres.
Y entonces vamos a iterar a través de esa
cadena mirando cada índice en la matriz.
Así que aquí está nuestro ejemplo.
Nuevamente, el búfer es nuestra matriz de
caracteres que almacenará las entradas. Usaremos scanf para completar eso.
Tenemos que escribir nuestra cadena sin espacios, es una sola cadena.
Vamos a ejecutarlo, revisar cada elemento en el búfer y luego llamar a
las funciones is alpha, is digit o is punct para ver
si esos caracteres están allí, y
luego se incrementará en función de eso, ya sea que devuelve verdadero o falso y
luego mostrará cuántas letras, dígitos y caracteres de puntuación hay dentro de esa cadena.
Ejecutemos esto.
Solo voy a ingresar algo con un montón de mayúsculas,
tal vez algunos dígitos.
Luego, cuando presione retorno, contará todo. Entonces dice
que mi dirección contenía 24 letras, 4 dígitos y 1
carácter de puntuación, los dos puntos.
Un programa pequeño y agradable que utiliza esas funciones de
caracteres, pero es útil para um analizar una cadena porque eso
es lo que estás haciendo, estás analizando la cadena, pero
simplemente estás revisando carácter por carácter. Gracias.