Saltar al contenido principal

# 6.2: Manipulación de cuerdas

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\id}{\mathrm{id}}$$ $$\newcommand{\Span}{\mathrm{span}}$$

( \newcommand{\kernel}{\mathrm{null}\,}\) $$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$ $$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$ $$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\id}{\mathrm{id}}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\kernel}{\mathrm{null}\,}$$

$$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$

$$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$

$$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$ $$\newcommand{\AA}{\unicode[.8,0]{x212B}}$$

$$\newcommand{\vectorA}[1]{\vec{#1}} % arrow$$

$$\newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow$$

$$\newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vectorC}[1]{\textbf{#1}}$$

$$\newcommand{\vectorD}[1]{\overrightarrow{#1}}$$

$$\newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}}$$

$$\newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}}$$

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\avec}{\mathbf a}$$ $$\newcommand{\bvec}{\mathbf b}$$ $$\newcommand{\cvec}{\mathbf c}$$ $$\newcommand{\dvec}{\mathbf d}$$ $$\newcommand{\dtil}{\widetilde{\mathbf d}}$$ $$\newcommand{\evec}{\mathbf e}$$ $$\newcommand{\fvec}{\mathbf f}$$ $$\newcommand{\nvec}{\mathbf n}$$ $$\newcommand{\pvec}{\mathbf p}$$ $$\newcommand{\qvec}{\mathbf q}$$ $$\newcommand{\svec}{\mathbf s}$$ $$\newcommand{\tvec}{\mathbf t}$$ $$\newcommand{\uvec}{\mathbf u}$$ $$\newcommand{\vvec}{\mathbf v}$$ $$\newcommand{\wvec}{\mathbf w}$$ $$\newcommand{\xvec}{\mathbf x}$$ $$\newcommand{\yvec}{\mathbf y}$$ $$\newcommand{\zvec}{\mathbf z}$$ $$\newcommand{\rvec}{\mathbf r}$$ $$\newcommand{\mvec}{\mathbf m}$$ $$\newcommand{\zerovec}{\mathbf 0}$$ $$\newcommand{\onevec}{\mathbf 1}$$ $$\newcommand{\real}{\mathbb R}$$ $$\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}$$ $$\newcommand{\laspan}[1]{\text{Span}\{#1\}}$$ $$\newcommand{\bcal}{\cal B}$$ $$\newcommand{\ccal}{\cal C}$$ $$\newcommand{\scal}{\cal S}$$ $$\newcommand{\wcal}{\cal W}$$ $$\newcommand{\ecal}{\cal E}$$ $$\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}$$ $$\newcommand{\gray}[1]{\color{gray}{#1}}$$ $$\newcommand{\lgray}[1]{\color{lightgray}{#1}}$$ $$\newcommand{\rank}{\operatorname{rank}}$$ $$\newcommand{\row}{\text{Row}}$$ $$\newcommand{\col}{\text{Col}}$$ $$\renewcommand{\row}{\text{Row}}$$ $$\newcommand{\nul}{\text{Nul}}$$ $$\newcommand{\var}{\text{Var}}$$ $$\newcommand{\corr}{\text{corr}}$$ $$\newcommand{\len}[1]{\left|#1\right|}$$ $$\newcommand{\bbar}{\overline{\bvec}}$$ $$\newcommand{\bhat}{\widehat{\bvec}}$$ $$\newcommand{\bperp}{\bvec^\perp}$$ $$\newcommand{\xhat}{\widehat{\xvec}}$$ $$\newcommand{\vhat}{\widehat{\vvec}}$$ $$\newcommand{\uhat}{\widehat{\uvec}}$$ $$\newcommand{\what}{\widehat{\wvec}}$$ $$\newcommand{\Sighat}{\widehat{\Sigma}}$$ $$\newcommand{\lt}{<}$$ $$\newcommand{\gt}{>}$$ $$\newcommand{\amp}{&}$$ $$\definecolor{fillinmathshade}{gray}{0.9}$$

Un aspecto confuso de las cadenas C para principiantes (especialmente las que vienen de BASIC o incluso Python) es cómo manipularlas. Es decir, ¿cómo se copia una cadena a otra, se comparan cadenas, se extrae una subcadena, y así sucesivamente? Como las cadenas son realmente matrices, no se puede asignar una a la otra como en a [] = b []; En cambio, confiamos en una serie de funciones de cadena que se encuentran en la biblioteca de cadenas. Para usar estas funciones, necesitas vincular tu código con la biblioteca de cadenas y usar #include <string.h>al inicio de tu código. Para copiar una cadena a otra, use strcpy (). La plantilla es:

strcpy( destination, source );

Entonces, si quisieras copiar el contenido de my_pet [] en n [], podrías escribir:

strcpy( &n[0], &my_pet[0] );

Si estás despierto en este punto, podrías preguntarte “¿Qué pasa con el ampersand?” ¡Buena pregunta! Lo que necesita la función de copia de cadena son las direcciones iniciales de las dos matrices. En esencia, lo único que hace es copiar un carácter a la vez desde el origen hasta el destino. Cuando golpea el nulo final está hecho. Ya vimos la “dirección de” (&) operador antes cuando miramos scanf (). Entonces, todo lo que estamos diciendo aquí es “Para la fuente, comience en la dirección del primer carácter de my_pet [], y para el destino, comience en el primer carácter de n []”. Esto puede ser un poco engorroso, por lo que C ofrece un atajo. Puedes pensar en & y [] como una especie de cancelación entre sí. Normalmente escribiríamos:

strcpy( n, my_pet );

Tenga en cuenta que es perfectamente aceptable usar un índice que no sea cero si necesita copiar solo un trozo de la cadena. Podrías comenzar a copiar desde el índice 2 si lo deseas, y simplemente obtener “do” en lugar de “fido”:

strcpy( n, &my_pet[2] );

Esto también puede ser un atajo usando:

strcpy( n, my_pet+2 );

es decir, no empieces en la dirección del primer elemento de my_pet [], inicia 2 caracteres después. Veremos este tipo de manipulación mucho más de cerca cuando examinemos direcciones y punteros.

¿Qué sucede si la cadena de origen tiene más caracteres de los que se asignó la cadena de destino? Por ejemplo, ¿y si hicieras esto?

strcpy( my_pet, n );

Esto da como resultado una sobrescritura de memoria que puede destruir accidentalmente otras variables o funciones. ¡Muy mal! Su programa puede chocar, y en algunos casos, su sistema operativo mi accidente. Para protegerte contra esto, puedes usar strncpy (). Esto pone un límite en el número de caracteres copiados al agregar un tercer argumento. Como el destino solo tiene espacio para 5 caracteres, usarías:

strncpy( my_pet, n, 5 );

Esta función se detendrá en 5 caracteres. Desafortunadamente, no anulará automáticamente la cadena si se alcanza el límite. Para estar seguro, necesitarías agregar la siguiente línea:

my_pet[4] = 0; /* force null termination */

Recuerde, como C cuenta desde 0, el índice 4 es el quinto (y final) elemento. Hay muchas funciones disponibles para manipular cadenas así como caracteres individuales. Aquí hay una breve lista:

 strcmp () Compara dos cadenas (alfabéticamente) strcmpi () Como se indicó anteriormente, pero insensible a mayúsculas strncmp () Compara dos cuerdas con la longitud máxima strncat () Concatenar dos cadenas con longitud máxima strlen () Encontrar longitud de cadena (recuento de caracteres antes nulo)

El siguiente trabajo sobre caracteres individuales. Nuevamente esto es solo una muestra para darte una idea de lo que hay ahí fuera. Usar #include <ctype.h>

 icena () Determina si el carácter está en mayúsculas isalpha () Determina si el carácter es alfabético (no numeral, puntuación, etc.) tolower () Convierte personaje en versión minúscula

Si no tienes documentación de biblioteca, puede ser muy instructivo simplemente abrir varios archivos de encabezado y mirar los prototipos de funciones para ver qué hay disponible. Sin embargo, haga lo que haga, ¡no edite estos archivos!

Finalmente, si necesitas convertir cadenas numéricas en valores enteros o de coma flotante, usa las funciones atoi (), atol () y atof (). (ASCII a int o long int en stdlib.h, ASCII a flotar en math.h).

This page titled 6.2: Manipulación de cuerdas is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform.