Eliminación de cadenas en lenguaje C
La razón por la que dejé la cadena char* y elegí la clase string en la biblioteca estándar de C es porque, en comparación con la primera, no tengo que preocuparme por si hay suficiente memoria y caracteres, la longitud de la cadena y, como clase, sus funciones de operación integradas son suficientes para satisfacer nuestras necesidades en la mayoría de los casos (incluso 100). Podemos usar = para asignación, == para comparación y conexión (¿es simple?). Podemos considerarlo como un tipo de datos básico de C.
Primero, para utilizar el tipo cadena en nuestro programa, debemos incluir el archivo de encabezado
# include lt string gt // Tenga en cuenta que esto no es string.h string. h Pero el archivo de encabezado de cadena C.
1. Declarar una cadena C.
Declarar una variable de cadena es simple:
String Str
De esta manera declaramos una variable de cadena, pero como es una clase, existe un Constructor y destructor. La declaración anterior no pasa parámetros, por lo que el constructor predeterminado de cadena se usa directamente. La función de esta función es inicializar str en una cadena vacía. El constructor y destructor de la clase String son los siguientes:
a) String s; //Generar una cadena vacía s
b) Strings s (str) //Copiar construcción The La función genera una copia de STR.
c) Strings s (str, stridx) // Tome la parte "comenzando desde Stridx" de la cadena str como valor inicial de la cadena.
d) Strings s (str, STRDX, strlen) // Utilice la parte de la cadena STR que "comienza con STRDX y tiene una longitud de como máximo STRLEN" como valor inicial de la cadena.
e) String s (CSTR) // Utilice la cadena C como valor inicial de s.
f) String s (chars, chars_len) //Toma el primer carácter chars_len de la cadena C como valor inicial de la cadena s.
g) strings s (num, c) // Genera una cadena que contiene num c caracteres.
h) El intervalo de la cadena s (inicio, fin) // es inicio; los caracteres al final (excluyendo el final) se utilizan como valor inicial de la cadena s.
I)s. ~ string() // Destruye todos los caracteres y libera memoria.
Es muy sencillo, así que no lo explicaré.
2. Funciones de operación de cadenas
Este es el foco de las cadenas C. Primero enumero las diversas funciones operativas. Aquellos a quienes no les guste leer todas las funciones pueden encontrar su favorito aquí y luego ver su explicación detallada más adelante.
a) =, asignar() // con nuevo valor.
b) swap() //Intercambia el contenido de dos cadenas.
c) =, append(), push_back() //Agrega caracteres al final.
d) insert() //Insertar caracteres
e) Erase() //Eliminar caracteres
f) clear() //Eliminar todos los caracteres.
g) reemplazar () //reemplazar carácter
h) //concatenar cadenas
i) =,! =, lt, lt=, gt, gt=, Compare() // Compara cadenas
j) size(), length() // Devuelve el número de caracteres.
k) max_size() // Devuelve el máximo número posible de caracteres.
l) vacío() // Determina si la cadena está vacía.
m)capacity() //Devuelve la capacidad de caracteres antes de la reasignación.
n) reserve() // Reserva una cierta cantidad de memoria para acomodar una cierta cantidad de caracteres.
o) [], at() //Accede a un solo carácter
p) gt; gt, getline() // Lee el valor de la secuencia.
q) lt; lt//Escribe el valor de búsqueda en la secuencia.
r) copy() //Asignar valor a C_string.
s) C_str() //Devuelve el contenido en formato C_string.
t)data() //Devuelve el contenido como una matriz de caracteres.
u)substr() //Devuelve la subcadena.
v) Función de búsqueda
w) begin() end() // Proporciona soporte para iteradores tipo STL.
x) rbegin() render() // Iterador inverso
y) get_allocator() // Devuelve el configurador.
Se presentan los siguientes detalles:
2.1 cadena c y conversión de cadena C
El método proporcionado por C para obtener la cadena_C correspondiente de una cadena C es use data(), c_str() y copy(), donde data() devuelve el contenido de la cadena como una matriz de caracteres sin agregar "\0". C_str() devuelve una matriz de caracteres terminada en "\0", mientras que copy() copia o escribe el contenido de una cadena en una c_string o matriz de caracteres existente. Las cadenas C no terminan en "\0". Mi sugerencia es utilizar cadenas C en sus programas a menos que no utilice c_string como último recurso. Dado que es solo una breve introducción y una introducción detallada, cualquiera que quiera conocer más notas de uso puede dejarme un mensaje (a mi bandeja de entrada). Déjame explicarlo en detalle.
2.2 Funciones de tamaño y capacidad
Una cadena C tiene tres tamaños: a) El número de caracteres existente, las funciones son tamaño() y longitud(), son equivalentes. Vacío() se utiliza para comprobar si una cadena está vacía. b) max_size() se refiere al número máximo de caracteres que puede contener la cadena C actual, lo que probablemente esté relacionado con las limitaciones de la propia máquina o el tamaño de la memoria contigua donde se encuentra la cadena. Normalmente no tenemos que preocuparnos por él, debería ser lo suficientemente grande para nosotros. Pero si no es suficiente, generará una excepción length_error c) capacidad() El número máximo de caracteres que puede contener una cadena antes de que se reasigne la memoria. Otra cosa a señalar aquí es la función reserve(), que reasigna memoria para la cadena. El tamaño de la redistribución está determinado por sus parámetros, que por defecto son 0. En este momento, la cuerda disminuirá involuntariamente.
También es necesario repetir el tema de la cadena C y la conversión de cadena C. Muchas personas encontrarán este problema: sus programas llamarán a funciones y clases de otras personas (como la función de conexión de base de datos Connect (char*, char*)), pero los parámetros de las funciones de otras personas están todos en forma de char *. c_str () y la matriz de caracteres devuelta por data() pertenecen a esta cadena. Por lo tanto, es un char* constante. Si desea usarlo como parámetro de la función anterior, debe copiarlo en un char*, nuestro principio es no usar cadenas C. Entonces, nuestro método de procesamiento en este momento es: si esta función no modifica el contenido del parámetro (es decir, char*), podemos conectarnos así ((char *) userid. c_str(), (char *) passwd . c _ str()), pero esto es peligroso porque la cadena convertida en realidad es modificable (curiosamente). Por supuesto, de todos modos es más seguro copiarlo en un char*.
Al mismo tiempo, también rezamos para que aquellos maestros que todavía usan la programación en cadena C (no es exagerado decir que son maestros, tal vez comenzaron a programar cuando todavía llevábamos pantalones sin entrepierna, jaja...) tengan funciones estandarizadas. para que no sea necesario realizar una conversión forzada.
2.3 Acceso al elemento
Podemos utilizar el operador de subíndice [] y la función at() para acceder a los caracteres contenidos en el elemento. Pero cabe señalar que el operador [] no comprueba si el índice es válido (índice válido 0~str.length()). Si el índice no es válido, se producirá un comportamiento indefinido. At() comprobará y si el índice no es válido cuando se utiliza at(), se generará una excepción fuera de rango.
Debo decir que hay una excepción. El operador [] de la cadena constante a; sigue siendo válido para el valor de índice de a.length() y su valor de retorno es "\0". En otros casos, la indexación a.length() no es válida. Los ejemplos son los siguientes:
const string Cstr ("const string");
string Str ("cadena"); / OK
str . //OK
str[100]; //Comportamiento no definido
str ); //Tirar fuera del rango
str[str.length()]//Comportamiento indefinido.
CSTR【CSTR . length()】//Devuelve "\0"
str at(str . length()); //Tirar fuera de rango
CSTR . at(CSTR . length()) ////tirar _ de _ rango
No estoy de acuerdo con la siguiente referencia o asignación de puntero:
char ampr = s 【2】;
char * p = amps【3】;
Porque una vez que ocurre la reasignación, R y P dejarán de ser válidos inmediatamente. La forma de evitarlo es no utilizarlo.
2.4 Función de comparación
La cadena C admite operadores de comparación comunes (》;, gt=, lt, lt=, ==, !=), e incluso admite cadenas y C - Comparación entre cadenas (como str, gt=, lt, lt). Cuando se utilizan estos operadores, los caracteres se compararán uno por uno en el orden del diccionario de acuerdo con las "características de los caracteres actuales". , y el orden de comparación es de adelante hacia atrás. Cuando se encuentran caracteres desiguales, los tamaños de las dos cadenas se determinan en función de los resultados de la comparación de los dos caracteres en esa posición. Al mismo tiempo, la cadena ("AAAA". ) . Otra función de comparación poderosa es la función miembro compare(). Admite el procesamiento multiparámetro y la comparación con valores de índice y subcadenas de posicionamiento de longitud. el resultado de la comparación El significado del valor de retorno es el siguiente: 0-igual》 0 - mayor que String s("ABCD"); Compare("ABCD") ; //Devuelve 0 s.compare("dcba "); //Devuelve un valor menor que 0. s.compare("ab"); valor mayor que 0 Compare; //Igual s. compare(0, 2, s, 2, 2); //La comparación entre ab y cd es menor que cero. s. compare(1, 2, "bcx", 2); //Comparar "B.C." Un algoritmo de comparación más personalizado. Primero, déjame darte un consejo: utiliza el algoritmo de comparación STL. ¿Qué? ¿No sabes nada sobre STL? ¡Maldita sea, tú lo reconstruyes! 2.5 Cambiar contenido Esto representa gran parte de las operaciones de cadenas. Hablemos primero de la tarea. El primer método de asignación es, por supuesto, utilizar el operador =. El nuevo valor puede ser una cadena (por ejemplo, s=ns), una cadena_c (por ejemplo, s="gaint") o incluso un solo carácter (por ejemplo, s="j"). También puede utilizar la función miembro asignar (), que le permite asignar valores de cadena de manera más flexible. Pongamos un ejemplo: s.assign(str); //No más conversaciones s.assign(str, 1, 3); //Si str es "iamangel" , luego asigna "ama" a la cadena. s.assign(str, 2, string::NPOs); //Asigna la cadena str desde el valor de índice 2 hasta el final a S. Asignación de EE. UU.("gaint"); //No más s.assign("Nico", 5); //Cambiar "n''I''c ''); o''\0' se asigna a la cadena. s.assign(5,'x'); //Asigna cinco x a la cadena Hay tres. Hay tres formas de borrar una cadena: s = ""; s. clear(); s. erase(); ¡Cada vez siento que dar ejemplos es más fácil de entender que hablar! Hay muchas funciones para insertar, borrar, reemplazar y agregar caracteres. Hablemos de agregar caracteres (aquí está la función de agregar =, append() y push_back()). son los siguientes: s = str; //Agregar una cadena s = "Mi nombre es jiayp" //Agregar una cadena C s ='a ';//Agrega un carácter s. append(str) s. append(str, 1, 3); //Diferente del parámetro de función anterior. explicación de la tarea <. /p> s.append(str, 2, string::NPOs) // Sin explicación s.append("Mi nombre es jiayp"); s.append("Nico", 5); s.append(5,'x'); s.push_back('a'); / Esta función solo agrega un carácter al STL y es muy simple de entender. Tal vez necesites insertar una cadena en algún lugar en el medio, en cuyo caso puedes usar la función insert(), que. requiere que especifique el índice de la posición de inserción, después de la cual se colocará la cadena insertada s. 1, str); Esta forma de función insert() no admite el paso de un solo carácter, por lo que un solo carácter debe escribirse como una cadena (asqueroso, no tengo más remedio que continuar leyendo). el siguiente párrafo: Para insertar un solo carácter, la función insert() proporciona dos funciones sobrecargadas para insertar un solo carácter: insert(size_type index, size_type num, chart c) e insert() iterador pos, size_type num, chart c ). donde size_type es un entero sin signo y el iterador es char*, por lo que la función de inserción no se puede llamar así: insert(0, 1, 'j'); ¿a cuál se convertirá el primer parámetro en este momento? Entonces tienes que escribir: insert((string::size_type)0, 1, 'j')! La segunda forma se refiere a la forma de insertar caracteres usando un iterador, que se mencionará más adelante. Por cierto, la cadena tiene muchas operaciones que utilizan iteradores STL, que intentan acercarse a STL. La función eliminar() tiene varias formas (¡qué molesta!), y hay varias funciones de reemplazo reemplazar(). Por ejemplo: string s = "il8n"; s.replace(1, 2, "Internationalization"); //Reemplace las dos cadenas comenzando desde el índice 1 con lo siguiente C_string individual. s.erase(13); //Eliminar todo del índice 13. s. erase(7, 5); //Eliminar 5 del índice 7. 2.6 Extracción de subcadenas y concatenación de cadenas La función de subcadena es substr(), como se muestra a continuación: s . Contenido completo del s. s . substr (11); //La subcadena después del índice 11 s . substr (5, 6); //Los 6 caracteres después del índice 5. La función que combina dos cadenas es . (Si no lo entiende, marque 120) 2.7 Operaciones de entrada y salida 1. gt gt lee una cadena del flujo de entrada. 2. lt lt escribe la cadena en el flujo de salida. Otra función es getline(), que lee una línea del flujo de entrada hasta que se encuentra un carácter de nueva línea o se llega al final del archivo. 2.8 Buscar y encontrar Hay muchas funciones de búsqueda potentes, que incluyen: Buscar() rfind() p> find_first_of() find_last_of() find_first_not_of() find_last_not_of() Estos Las funciones devuelven un rango de caracteres. Se devuelve el índice del primer carácter que satisface los criterios de búsqueda, o npos si no se encuentra el objetivo. Los parámetros de todas las funciones se describen a continuación: El primer parámetro es el objeto de búsqueda. El segundo parámetro (opcional) indica el índice de la cadena donde comienza la búsqueda y el tercer parámetro (opcional) indica la cantidad de caracteres a buscar. Relativamente simple. Si no lo entiendes bien, puedes preguntarme y te responderé seriamente. Por supuesto, más adelante se mencionarán búsquedas STL más potentes. Por último, hablemos de qué es una organización sin ánimo de lucro. El tipo de cadena::npos es cadena::tamaño_tipo. Por lo tanto, una vez que es necesario comparar un indicador con NPO, el valor del indicador debe ser del tipo cadena::tamaño). En más casos, podemos comparar directamente funciones con NPO (por ejemplo, if(s.find("Jia") == string:).