Trabajos trimestrales, trabajos de laboratorio y diplomas en informática.
Trabajando con cuerdas. Clase de cadena. Constructores de clases. Las funciones asignar (), agregar (), insertar (), reemplazar (), borrar (), buscar (), rfind (), comparar (), c_str (). Ejemplos de
1. ¿Cuál es el propósito de la clase de cadena en los programas C ++?
La clase de cadena está diseñada para trabajar con cadenas de tipo char *, que son cadenas terminadas en nulo. La clase de cadena se introdujo como Opción alternativa para trabajar con cadenas de tipo char *. Líneas que terminan con un personaje ‘\0’ también llamado C-strings. Dado que la cadena es una clase, puede declarar objetos de esta clase.
2. ¿Qué módulos (bibliotecas) deben conectarse para utilizar las capacidades de la clase de cadena en MS Visual Studio C ++?
Para utilizar las capacidades de la clase de cadena en MS Visual Studio (C ++), debe incluir la biblioteca
3. ¿Cómo se declara una variable del tipo cadena? Ejemplos de
La declaración de una variable de tipo cadena se realiza de la misma forma que una variable regular. Posible variante declaraciones de inicialización simultáneas.
// tipo de cadena string s1; // variable llamada s1 de tipo cadena string s2 = "Esta es una variable de cadena"; // declaración con inicialización // usando una variable de tipo cadena con un operador de asignación s1 = s2; // s1 = "Esta es una variable de cadena" s2 = "Nuevo texto";4. ¿Cuáles son las ventajas y desventajas de usar la clase de cadena frente a char *?
La creación del nuevo tipo de cadena se debió a las deficiencias de trabajar con cadenas de caracteres, que demostró el tipo char *. En comparación con el tipo char *, el tipo de cadena tiene las siguientes ventajas principales:
- la capacidad de procesar cadenas utilizando operadores C ++ estándar ( = , + , = = , <> etc.). Como sabe, al usar el tipo char *, incluso las operaciones más simples con cadenas parecían complicadas y requerían una escritura excesiva código de programa;
- asegurando la mejor confiabilidad (seguridad) del código del programa. Por ejemplo, al copiar cadenas, el tipo de cadena proporciona las acciones adecuadas que pueden ocurrir si la cadena de origen es más grande que la cadena de destino;
- proporcionando una cadena como tipo de datos independiente. La declaración del tipo de cadena como cadena es la misma para todas las variables del programa, lo que garantiza la coherencia de los datos.
La principal desventaja del tipo de cadena en comparación con el tipo char * es la velocidad de procesamiento de datos más lenta. Esto se debe a que el tipo de cadena es en realidad una clase de contenedor. Y trabajar con una clase requiere una implementación adicional del código del programa, lo que, a su vez, requiere más tiempo.
5. ¿Qué operadores se pueden usar con objetos de la clase string?
La clase de cadena es conveniente porque le permite manipular cadenas de manera conveniente utilizando operadores estándar (sobrecargados).
Los siguientes operadores se pueden usar con objetos de la clase string
- = - asignación
- + - concatenación (concatenación de cadenas)
- += - asignación con concatenación
- == - igualdad
- != - desigualdad
- < - más pequeño
- <= - Menos que o igual a
- > - más
- >= - más o igual
- - indexación
Ejemplo, que demuestra el uso de los operadores anteriores
// tipo de cadena, operaciones sobre cadenas cadena s1 = "s-1"; cadena s2 = "s-2"; string s3; bool b; // operación "=" (asignación de cadenas) s3 = s1; // s3 = "s-1" // operación "+" - concatenación de cadenas s3 = s3 + s2; // s3 = "s-1s-2" // operación "+ =" - asignación con concatenación s3 = "s-3"; s3 + = "abc"; // s3 = "s-3abc" // operación "==" - comparación de cadenas b = s2 == s1; // b = falso b = s2 == "s-2"; // b = verdadero // operación "! =" - comparación de cadenas (no es igual) s1 = "s1"; s2 = "s2"; b = s1! = s2; // b = verdadero // operaciones "<" и ">"- comparación de cadenas s1 = "abcd"; s2 = "de"; b = s1> s2; // b = falso b = s1< s2; // b = true // operaciones "<=" и ">= "- comparación de cadenas (menor o igual, mayor o igual) s1 = "abcd"; s2 = "ab"; b = s1> = s2; // b = verdadero b = s1<= s2; // b = false b = s2 >= "ab"; // b = verdadero // operación - indexación char c; s1 = "abcd"; c = s1; // c = "c" c = s1; // c = "a"6. ¿La clase de cadena contiene constructores?
Como cualquier clase, la clase de cadena tiene varios constructores. Los principales son los siguientes:
Cuerda (); cadena (const char * str); cadena (cadena constante & str);
7. Ejemplos de inicialización mediante constructores
A continuación se muestran ejemplos de inicialización de variables de tipo cadena
String s1 ("¡Hola!"); string s2 = "¡Hola!" ; // inicialización - cadena de constructor (const char * str) char * ps = "Hola"; cadena s3 (ps); // cadena de inicialización s4 (s3); // inicialización - cadena de constructor (cadena const & str) string s5; // inicialización - constructor string ()
8. Asignación de cadenas. Función Assign (). Ejemplos de
Para asignar una cadena a otra, puede utilizar uno de estos dos métodos:
- utilizar operador de asignación ‘=’ ;
- use la función asignar () de la clase de cadena.
La función asignar () tiene varias implementaciones sobrecargadas.
La primera opción es llamar a una función sin parámetros.
Cadena y asignación (anulado);
En este caso, hay una simple asignación de una cadena a otra.
La segunda opción le permite copiar un número determinado de caracteres de una cadena:
Cadena & asignar (const cadena & s, size_type st, size_type num);
- s - el objeto del que se toma la cadena fuente;
- st - índice (posición) en la cadena desde la que empezar a copiar num caracteres;
- num - el número de caracteres a copiar desde la posición st;
- size_type es un tipo de datos ordinal.
La tercera variante de la función asignar () copia el primer número de caracteres de la cadena s al llamador:
Cadena y asignación (const char * s, size_type num);
- s - una cadena terminada con un carácter ‘\0’ ;
- num es el número de caracteres que se copian a la persona que llama. Se copian los primeros números de caracteres de la cadena s.
A continuación se muestra un ejemplo con diferentes implementaciones de la función asignar ().
Ejemplo.
// asignación de cadenas, función asignar () cadena s1 = "sitio"; string s2; string s3; char * ps = "sitio"; s3 = s1; // s3 = "sitio" s2.assign (s1); // s2 = "sitio" s2.assign (s1, 0, 4); // s2 = "mejor" s2.assign (ps, 8); // s2 = "bestprog"9. Concatenación de cadenas. Función Append (). Ejemplo
La función append () se usa para concatenar cadenas. También puede usar la operación para agregar líneas ‘+’ , por ejemplo:
String s1; string s2; s1 = "abc"; s2 = "def"; s1 = s1 + s2; // s1 = "abcdef"
Sin embargo, la función append () es buena cuando necesita agregar parte de una cadena.
La función tiene las siguientes opciones de implementación:
String & append (const string & s, size_type start); string & append (const char * s, size_type num);
En la primera implementación, la función recibe un enlace a un objeto de cadena s que se agrega a la persona que llama. En la segunda implementación, la función recibe un puntero a una cadena const char *, que termina con el carácter '\ 0'.
Ejemplo. Demostración de la función append ().
String s1 = "abcdef"; s2 = "1234567890"; añadir (s2, 3, 4); // s1 = "abcdef4567" char * ps = "1234567890"; s1 = "abcdef"; s1.append (ps, 3); // s1 = "abcdef123"
10. Insertar caracteres en una línea. Función de inserción. Ejemplo
Para insertar una línea en una posición determinada de otra línea, debe usar la función insert (), que tiene varias opciones de implementación.
La primera versión de la función le permite insertar la cadena completa s en la posición inicial dada de la línea de llamada (objeto de llamada):
String & insert (tamaño_tipo inicio, const cadena & s);
La segunda versión de la función le permite insertar una parte (insStart, num parámetros) de la cadena s en la posición inicial dada de la cadena de llamada:
String & insert (tamaño_tipo inicio, const cadena & s, tamaño_tipo insStart, tamaño_tipo num);
En las funciones anteriores:
- s - la cadena que se insertará en la cadena de llamada;
- inicio - la posición en la línea de llamada desde la cual insertar la cadena s;
- insStart - la posición en la cadena s desde la cual insertar;
- num es el número de caracteres en la cadena s que se insertarán desde la posición insStart.
11. Reemplazo de caracteres en una cadena. Función Reemplazar (). Ejemplo
La función replace () reemplaza caracteres en la cadena de llamada. La función tiene las siguientes opciones de implementación:
Cadena y reemplazo (tamaño_tipo inicio, tamaño_tipo num, const cadena & s); string & replace (tamaño_tipo inicio, tamaño_tipo num, const cadena & s, tamaño_tipo replStart, tamaño_tipo núm_repl);
En la primera implementación, la cadena de llamada se reemplaza por la cadena s. Es posible establecer la posición (inicio) y el número de caracteres (num) en la línea de llamada, que debe reemplazarse con la cadena s.
La segunda versión de la función replace () difiere de la primera en que le permite reemplazar la cadena de llamada con solo una parte de la cadena s. En este caso, dos parámetros adicionales: la posición de replStart y el número de caracteres en la cadena s que forman la subcadena que reemplaza la cadena de llamada.
Ejemplo. Demostración de la función replace ().
String s1 = "abcdef"; cadena s2 = "1234567890"; s2.replace (2, 4, s1); // s2 = "12abcdef7890" s2 = "1234567890"; s2.replace (3, 2, s1); // s2 = "123abcdef67890" s2 = "1234567890"; s2.replace (5, 1, s1); // s2 = "12345abcdef7890" // reemplazar caracteres, reemplazar () función cadena s1 = "abcdef"; cadena s2 = "1234567890"; s2.replace (2, 4, s1); // s2 = "12abcdef7890" s2 = "1234567890"; s2.replace (3, 2, s1); // s2 = "123abcdef67890" s2 = "1234567890"; s2.replace (5, 1, s1); // s2 = "12345abcdef7890" s2 = "1234567890"; s2.replace (5, 1, s1, 2, 3); // s2 = "12345cde7890" s2 = "1234567890"; s2.replace (4, 2, s1, 0, 4); // s2 = "1234abcd7890"
12. Remoción una cantidad determinada caracteres de la cadena. Función borrar (). Ejemplo
Para eliminar caracteres de la cadena de llamada, use la función erase ():
String & erase (size_type index = 0, size_type num = npos);
- índice - índice (posición), a partir del cual desea eliminar caracteres en la línea de llamada;
- num es el número de caracteres que se eliminarán.
Ejemplo.
Cadena s = "01234567890"; borrar (3, 5); // s = "012890" s = "01234567890"; s.erase (); // s = ""
13. Busque un carácter en una cadena. Funciones Find () y rfind (). Ejemplos de
En la clase de cadena, la búsqueda de una cadena en una subcadena se puede realizar de dos formas, que difieren en la dirección de la búsqueda:
- mirando la cadena de principio a fin usando la función find ();
- escaneando la cadena de principio a fin con rfind ().
El prototipo de la función find () se ve así:
Size_type find (const string & s, size_type start = 0) const;
- s: la subcadena que se busca en la cadena, lo que provoca esta función... La función busca la primera aparición de la cadena s. Si la subcadena s se encuentra en la cadena que llamó a la función dada, se devuelve la posición de la primera aparición. De lo contrario, se devuelve -1;
El prototipo de la función rfind () es:
Size_type rfind (const string & s, size_type start = npos) const;
- s es la subcadena que se debe buscar en la cadena de llamada. La búsqueda de una subcadena en una cadena se realiza de principio a fin. Si la subcadena s se encuentra en la cadena de llamada, la función devuelve la posición de la primera aparición. De lo contrario, la función devuelve -1;
- npos - posición del último carácter de la línea de llamada;
- inicio: la posición desde la que se realiza la búsqueda.
Ejemplo 1. Un fragmento de código que demuestra el resultado de la función find ()
// tipo de cadena, función find () cadena s1 = "01234567890"; cadena s2 = "345"; cadena s3 = "abcd"; int pos; pos = s1.find (s2); // pos = 3 pos = s1.find (s2, 1); // pos = 3 pos = s1.find ("jklmn", 0); // pos = -1 pos = s1.find (s3); // pos = -1 pos = s2.find (s1); // pos = -1Ejemplo 2. Demostración de la función rfind ().
// tipo de cadena, funciones find () y rfind () cadena s1 = "01234567890"; cadena s2 = "345"; cadena s3 = "abcd"; cadena s4 = "abcd --- abcd"; int pos; pos = s1.rfind (s2); // pos = 3 pos = s1.rfind (s2, 12); // pos = 3 pos = s1.rfind (s2, 3); // pos = 3 pos = s1.rfind (s2, 2); // pos = -1 pos = s2.rfind (s1); // pos = -1 pos = s1.rfind (s3, 0); // pos = -1 // diferencia entre las funciones find () y rfind () pos = s4.rfind (s3); // pos = 7 pos = s4.find (s3); // pos = 014. Comparación de partes de cuerdas. Función Compare (). Ejemplo
Dado que el tipo de cadena es una clase, puede usar la operación para comparar dos cadenas entre sí ‘= =’ ... Si las dos cadenas son iguales, la comparación será verdadera. De lo contrario, el resultado de la comparación será falso.
Pero si necesita comparar parte de una cadena con otra, entonces se proporciona la función compare () para esto.
El prototipo de la función compare ():
int compare (tamaño_tipo inicio, tamaño_tipo num, const cadena & s) const;- s - la cadena para comparar con la cadena de llamada;
- inicio - posición (índice) en la cadena s, desde la cual comenzar a ver los caracteres de la cadena para compararlos;
- num es el número de caracteres en la cadena s para comparar con la cadena de llamada.
La función funciona de la siguiente manera. Si la cadena de llamada es menor que la cadena s, la función devuelve -1 (valor negativo). Si la cadena de llamada es mayor que la cadena s, la función devuelve 1 (valor positivo). Si las dos cadenas son iguales, la función devuelve 0.
Ejemplo... Demostración de la función compare ():
// tipo de cadena, función compare () cadena s1 = "012345"; cadena s2 = "0123456789"; int res; res = s1.compare (s2); // res = -1 res = s1.compare ("33333"); // res = -1 res = s1.compare ("012345"); // res = 0 res = s1.compare ("345"); // res = -1 res = s1.compare (0, 5, s2); // res = -1 res = s2.compare (0, 5, s1); // res = -1 res = s1.compare (0, 5, "012345"); // res = -1 res = s2.compare (s1); // res = 1 res = s2.compare ("456"); // res = -1 res = s2.compare ("000000"); // res = 115. Obtener una cadena con el carácter de final de línea '\ 0' (char *). Función C_str (). Ejemplo
Para obtener una cadena que termine con un carácter ‘\0’ se utiliza la función c_str ().
Prototipo de función:
const char * c_str () const;La función se declara con el modificador const. Esto significa que la función no puede modificar el llamador (cadena).
Ejemplo 1... Conversión de cadena a const char *.
// tipo de cadena, función c_str () cadena s = "abcdef"; const char * ps; ps = s.c_str (); // ps = "abcdef"Ejemplo 2.
A continuación se muestra la traducción de una cadena de cadena al tipo System :: String para mostrarla en un control del tipo Label.
El estándar C ++ moderno define una clase con funciones y propiedades (variables) para organizar el trabajo con cadenas (en el lenguaje C clásico, no hay cadenas como tales, solo hay matrices de caracteres):
#incluir
#incluir#incluir
Para trabajar con cadenas, también debe conectar el espacio de nombres estándar:
Usando el espacio de nombres std;
De lo contrario, tendrá que especificar el descriptor de clase std :: string en lugar de string en todas partes.
A continuación se muestra un ejemplo de un programa que funciona con cadenas (¡no funciona en compiladores antiguos compatibles con C!):
#incluir
Las principales características de la clase string:
- inicialización con una matriz de caracteres (una cadena de tipo incorporado) u otro objeto de tipo cadena. El tipo integrado no tiene la segunda opción;
- copiando una línea a otra. Para un tipo incorporado, debe usar la función strcpy ();
- acceso a caracteres individuales de la cadena para lectura y escritura. En una matriz incorporada, esto se hace usando la operación de tomar el índice o el direccionamiento indirecto usando un puntero;
- comparación de dos cadenas para la igualdad. Para los tipos integrados, se utilizan funciones de la familia strcmp ();
- concatenación (concatenación) de dos cadenas, dando el resultado como la tercera cadena o en lugar de una de las originales. Para un tipo incorporado, la función strcat () se usa, sin embargo, para obtener el resultado en nueva línea, es necesario utilizar secuencialmente las funciones strcpy () y strcat (), y también ocuparse de la asignación de memoria;
- medios incorporados para determinar la longitud de una cadena (funciones miembro de la clase size () y l ength ()). Puede averiguar la longitud de una cadena de un tipo incorporado solo mediante el cálculo utilizando la función strlen ();
- la capacidad de averiguar si una cadena está vacía.
Echemos un vistazo más de cerca a estas características básicas.
Inicializando cadenas al describir y Longitud de la línea(sin incluir el terminador nulo de terminación):
String st ("Mi cadena \ n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
La cadena se puede dar y vaciar:
String st2;
Para comprobar si esta la linea vacia, puedes comparar su longitud con 0:
If (! St.size ()) // vacío
o use el método vacío (), devolviendo verdadero para una cadena vacía y falso para una cadena no vacía:
If (st.empty ()) // vacío
La tercera forma de creación de cadenas inicializa un objeto de tipo cadena con otro objeto del mismo tipo:
Cadena st3 (st);
La cadena st3 se inicializa con la cadena st. ¿Cómo podemos asegurarnos de que estos las cuerdas coinciden? Usemos el operador de comparación (==):
Si (st == st3) // la inicialización funcionó
Cómo copiar una línea a otra? Con la operación de asignación habitual:
St2 = st3; // copia st3 a st2
Para concatenación de cadenas utilice la operación de suma (+) o la operación de asignación de suma (+ =). Dejemos que se den dos líneas:
String s1 ("hola"); cadena s2 ("mundo \ n");
Podemos obtener la tercera línea, que consiste en la concatenación de las dos primeras, así:
Cadena s3 = s1 + s2;
Si queremos agregar s2 al final de s1, tenemos que escribir:
S1 + = s2;
La operación de suma puede concatenar objetos de clase. cuerda no solo entre ellos, sino también con cadenas de tipo en línea. Puede reescribir el ejemplo anterior para que los caracteres especiales y los signos de puntuación estén representados por el tipo char * incorporado, y las palabras significativas estén representadas por objetos de cadena:
Const char * pc = ","; string s1 ("hola"); cadena s2 ("mundo"); cadena s3 = s1 + pc + s2 + "\ n"; cout<< endl << s3;
Expresiones como estas funcionan porque el compilador "sabe" cómo convertir automáticamente objetos del tipo incorporado en objetos de la clase de cadena. También es posible una simple asignación de una cadena en línea a un objeto de cadena:
String s1; const char * pc = "una matriz de caracteres"; s1 = pc; // Derecha
En este caso, la transformación inversa No funciona... Si intenta realizar la siguiente inicialización de una cadena de tipo incorporada, se producirá un error de compilación:
Char * str = s1; // error de compilación
Para realizar esta conversión, debe llamar explícitamente a la función miembro c_str () ("cadena C"):
Const char * str = s1.c_str ();
La función c_str () devuelve un puntero a una matriz de caracteres que contiene la cadena del objeto de cadena como estaría en un tipo de cadena incorporado. La palabra clave const aquí evita lo "peligroso" en los entornos visuales modernos la posibilidad de modificar directamente el contenido de un objeto a través de un puntero.
PARA personajes individuales Se puede acceder a un objeto de tipo cadena, como un tipo integrado, mediante la operación de tomar el índice. Por ejemplo, aquí hay un fragmento de código que reemplaza todos los puntos con guiones bajos:
String str ("www.disney.com"); int tamaño = str.size (); para (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Reemplazar (str.begin (), str.end (), ".", "_");
Es cierto que aquí no se usa el método de reemplazo de la clase de cadena, sino el algoritmo del mismo nombre:
#incluir
Debido a que el objeto de cadena se comporta como un contenedor, se le pueden aplicar otros algoritmos. Esto le permite resolver problemas que no se resuelven directamente con las funciones de la clase de cadena.
A continuación se muestra una breve descripción de los principales operadores y funciones de la clase de cadena; los enlaces de la tabla conducen a descripciones en ruso en Internet. Para obtener una lista más completa de las capacidades de la clase de cadena, consulte, por ejemplo, Wikipedia o cplusplus.com.
Especificar caracteres en una cadena |
|
operador = |
asigna valores a una cadena |
asignar |
asigna caracteres a una cadena |
Acceso a símbolos individuales |
|
a |
obtener el carácter especificado comprobando si el índice está fuera de los límites |
operador |
obteniendo el carácter especificado |
parte delantera |
obteniendo el primer personaje |
espalda |
obtener el último personaje |
datos |
devuelve un puntero al primer carácter de la cadena |
c_str |
devoluciones inmodificable una matriz de caracteres C que contiene los caracteres de la cadena |
Comprobación de la capacidad de la línea |
|
vacío |
comprueba si una cadena está vacía |
Talla |
devuelve el número de caracteres en una cadena |
tamaño máximo |
devuelve el número máximo de caracteres |
reserva |
reserva espacio para almacenamiento |
Operaciones de cadena |
|
claro |
limpia el contenido de la cadena |
insertar |
insertando símbolos |
borrar |
eliminar caracteres |
hacer retroceder |
agregar un carácter al final de la línea |
pop_back |
elimina el último carácter |
adjuntar |
|
operador + = |
agrega caracteres al final de la línea |
comparar |
compara dos cadenas |
reemplazar |
reemplaza cada aparición del carácter especificado |
substr |
devuelve una subcadena |
Copiar |
copia personajes |
cambiar el tamaño |
cambia el número de caracteres almacenados |
Permite al programa abrir archivos de datos en carpetas específicas como si estuvieran en la carpeta actual. Llamado sin parámetros, el comando adjuntar enumera los directorios vinculados. Sintaxisadjuntar [; ] [[disco: ]camino[; ...]] [/ X:{sobre|apagado}] [/ sendero:{sobre|apagado}] [/ e] Opciones; Borra la lista de carpetas especificadas en llamadas anteriores para agregar. [ disco: ]camino Especifica la unidad y la carpeta que desea adjuntar a la carpeta actual. Si no se especifica ninguna unidad, la unidad actual se utiliza de forma predeterminada. Es posible especificar varias combinaciones [ disco: ]camino separados por punto y coma. / X:{sobre | apagado) Determina si el subsistema MS-DOS buscará carpetas adjuntas al ejecutar programas. / x: encendido la búsqueda de carpetas adjuntas está en curso. / x: apagado no se realiza la búsqueda de carpetas adjuntas. / sendero:{sobre|apagado) Le dice al programa que busque archivos en las carpetas adjuntas si los nombres de los archivos se especifican en su totalidad. El valor predeterminado es / ruta: en... / e Escribe la lista de carpetas adjuntas en la variable de entorno APPEND. Este parámetro de línea de comando solo se puede usar la primera vez que se invoca el comando adjuntar después de iniciar el sistema. /? Muestra ayuda en la línea de comando.Notas
Ejemplos dePara poder abrir archivos de datos en programas de las carpetas B: \ Letters y A: \ Reports desde la carpeta actual, ingrese: añadir b: \ letras; a: \ informes añadir b: \ letras; a: \ informes Para preguntas, discusiones, comentarios, sugerencias, etc., puede utilizar sección del foro este sitio (se requiere registro).
|