Juega con funciones de cadena y funciones de caracteres - [Lenguaje C]

En el aprendizaje del lenguaje C, a menudo nos encontramos con cadenas, y existen innumerables formas de lidiar con ellas, pero no tenemos una buena manera de lidiar con ellas. Las cadenas solo se pueden usar en matrices de caracteres o cadenas constantes a través de funciones personalizadas. tratar con Ahora lo llevaré a aprender las funciones en la biblioteca de funciones del lenguaje C que se ocupan de las cadenas.

¡Todas estas funciones de procesamiento de cadenas se utilizan en #include<string.h> y #include<type.h>! A continuación, ¡conozcamos estas funciones en detalle! ! !

Tabla de contenido

Introducción a la función en string.h

función de aceleración

Función strcpyEditar

función strcat

función strcmp

función strstr

 función strtok

 Funciones de biblioteca más rigurosas

función strncpy

función strncat

función strncmp 

resumen 

Introducción a la función en ctype.h 


Introducción a la función en string.h

función de aceleración

La función strlen es para obtener el tamaño de la función de cadena (función)

1. El tipo de valor devuelto es size_t (entero sin signo)

2. El parámetro es recibir un puntero de tipo char* no modificable

3. La cadena a la que apunta el parámetro debe terminar en '\0'.

4. El valor de retorno de la función strlen es devolver la longitud de la cadena. Cuando el puntero apunta a '\0', el conteo finaliza, por lo que la longitud de la cadena no incluye '\0'. 

El siguiente programa utiliza la función strlen:

#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 }
 else
 {
 printf("srt1>str2\n");
 }
 return 0;
}

El análisis de código muestra que la longitud de la cadena de str1 es 6 y la longitud de la cadena de str2 es 3. 3-6=-3 debería generar str1>str2, pero el resultado real es: ¿por qué  ? Debido a que el tipo devuelto por la función strlen es un número entero sin signo, el resultado predeterminado de restar dos números también es un número entero sin signo. El complemento de -3 en el almacenamiento binario es muy grande, pero la computadora piensa que el complemento de -3 es su El código original, convertido a decimal, será un número positivo muy grande, por lo que el resultado de salida es incorrecto.

Si reemplazamos la condición en el juicio de la condición if con (strlen(str2)>strlen(str1)); ¡el resultado será correcto!

Vamos a crear una función personalizada para simular la implementación de la función strlen.

//模拟strlen函数

size_t my_strlen(char* arr)
{
	int count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}

int main(void)
{
	char arr[100];
	gets(arr);
	printf("%u\n", my_strlen(arr));

	return 0;
}

 Simulamos la función my_strlen imitando los parámetros, el valor devuelto y el principio de la función strlen. Específicamente, pase el primer elemento de la matriz de caracteres que necesitamos, cree una variable temporal count para contar el número de la matriz entrante, use el ciclo while para juzgar si el puntero apunta a '\0', si no apunta a count++, arr++ para contar y apuntar a Luego muévase hasta que llegue a '\0' para saltar fuera del bucle, devuelva el número de conteo para realizar la simulación de la función strlen.


función strcpy

La función srtcpy copia la cadena a la que apunta la fuente en la matriz apuntada;

1. El valor devuelto es un puntero char*, que apunta a la dirección del primer elemento de la cadena copiada.

2. Los parámetros son dos punteros de tipo char*, el último es la cadena copiada, por lo que no se puede modificar, y el primero es la cadena copiada.

3. La cadena de origen debe terminar con '\0'.

4. El espacio de destino debe ser lo suficientemente grande para garantizar que la cadena de origen se pueda almacenar.

5. El espacio objetivo debe ser variable.

6. Esta función copiará '\0' en la cadena de origen al espacio de destino.

El siguiente es el uso de la función strcpy:

int main(void)
{
	char arr1[100];
	char arr2[100] = "hello world";
	char* p = strcpy(arr1, arr2);
	printf("%s\n", p);

	return 0;
}

Copie la cadena en arr2 a arr1. 

 La siguiente es una simulación de la función strcpy:

模拟strcpy函数
char* my_strcpy(char* p1, const char* p2)
{
	assert(p1 && p2);
	char* ret = p1;
	while (*p1++ = *p2++)
	{
		;
	}
	return ret;
}


int main(void)
{
	char arr1[100];
	char arr2[100];
	gets(arr2);
	char* p = my_strcpy(arr1, arr2);
	printf("%s\n", p);
	return 0;
}

Nuestro propósito es copiar el contenido de arr2 a arr1, crear una función personalizada my_strpy que imite la plantilla de función de la función strcpy y usar la función de afirmación para afirmar para evitar que el puntero entrante sea un puntero nulo. Cree un puntero de carácter para marcar la dirección del primer elemento de la matriz de destino como valor de retorno. Use el ciclo while para juzgar la condición. Si p2 no es '\0', entonces realice la asignación *p1=*p2. Después de que la asignación sea exitosa, ambos punteros retroceden un bit hasta que p2 sea '\0' y el ciclo finaliza para completar la copia (la operación se puede simplificar a la condición de juicio de la declaración while), y finalmente se puede devolver la dirección de la matriz de destino.

El resultado es el siguiente:


función strcat

La función strcat es una función de concatenación de cadenas, concatenando una cadena conocida con una cadena de destino.

1. El valor devuelto es la dirección del primer elemento de la cadena de destino

2. Los dos parámetros son punteros de caracteres de tipo char*. El último puntero es la primera dirección del elemento de cadena conocido y no se puede modificar, por lo que se modifica con const. El puntero frontal es la primera dirección de la cadena de destino.

3. La cadena de origen debe terminar con '\0'.

4. El espacio de destino debe ser lo suficientemente grande para acomodar el contenido de la cadena de origen.

5. El espacio objetivo debe ser modificable.

 El siguiente es el uso de la función strcat:

int main(void)
{
	char arr1[20] = "hello ";
	char arr2[20] = "world";
	char* p = strcat(arr1, arr2);
	printf("%s\n", p);

	return 0;
}

El principio de la función strcat: encuentre la cadena de destino '\0' para sobrescribir, agregue la cadena conocida al final de la cadena de destino hasta el final de la cadena conocida '\0' y devuelva el puntero del primer elemento del objetivo cuerda

 Finalmente, la implementación analógica de la función strcat:

char* my_strcat(char* p1, const char* p2)
{
	assert(p1 && p2);
	char* ret = p1;
	while (*p1 != '\0')
		p1++;
	while (*p1++ = *p2++)
	{
		;
	}
	return ret;
}

int main(void)
{
	char* arr1[100];
	char* arr2[100];
	gets(arr1);
	gets(arr2);
	char* p = my_strcat(arr1, arr2);
	printf("%s\n", p);

	return 0;
}

 El objetivo es colocar la cadena conocida al final de la cadena de destino, por lo que cuando recibimos dos punteros, primero marcamos el primer elemento de la función de destino para preparar el valor de retorno final, y luego usamos el bucle while para señalar el puntero de la cadena de destino para Ir al final '\0', y luego la operación es la misma que el principio de la función strcpy, copiar y finalmente devolver el primer elemento de la función de destino para completar.

El siguiente es el resultado de ejecutar el código:


función strcmp

La función strcmp es una función que compara el tamaño de dos cadenas.

1. El valor devuelto es un número de tipo int

Si la primera cadena es mayor que la segunda cadena, devuelve un número mayor que 0

Si la primera cadena es igual a la segunda cadena, devuelve 0

La primera cadena es menor que la segunda cadena, devuelve un número menor que 0 

2. Los parámetros son dos cadenas para comparación. Para evitar que las dos cadenas se modifiquen involuntariamente, todas se modifican con const.

3. Esta función comienza comparando el primer carácter de cada cadena. Si son iguales entre sí, continúe con los siguientes pares hasta que los caracteres difieran o se alcance el carácter nulo de terminación.

El siguiente es el uso de la función strcmp:

int main(void)
{
	char arr1[100] = "hello";
	char arr2[100] = "hell";
	printf("%d\n", strcmp(arr1, arr2));

	return 0;
}

Las dos cadenas de hola e infierno, el infierno frontal es igual, solo la última o se compara con '\0', de acuerdo con el valor del código ascaii o es mayor que '\0', por lo que la cadena arr1 es más grande que la cadena arr2, devuelve 1. 

Finalmente, se simula e implementa la función strcmd:

//模拟实现strcmp函数

int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 && p2);
	while (*p1 == *p2)
	{
		p1++;
		p2++;
	}
	if (*p1 - *p2 > 0)
		return 1;
	else if (*p1 - *p2 < 0)
		return -1;
	else
		return 0;
}


int main(void)
{
	char arr1[100];
	char arr2[100];
	gets(arr1);
	gets(arr2);
	printf("%d\n", my_strcmp(arr1, arr2));
	return 0;
}

Pase las dos cadenas a la función, use el bucle while para comparar (*p1 == *p2), si son iguales, mueva los dos punteros un bit hacia atrás para continuar la comparación, si son iguales, devuelva 0, si *p1>* p2 devuelve 1 y *p1<*p2 devuelve -1.

Los siguientes son los resultados de la operación:


función strstr

La función de la función strstr es encontrar una subcadena. La subcadena es str2 y la cadena de destino es str1. 

1. El valor devuelto es un puntero de tipo char* y devuelve   un puntero a str1 que aparece por primera vez en  str2 Si str2 no forma   parte de str1 , se devuelve un puntero nulo.

2. El tipo de parámetro es dos punteros de caracteres, que apuntan a la cadena de destino y la subcadena respectivamente. Debido a que no se pueden modificar, se agrega const para la modificación.

3. El proceso de coincidencia no incluye el carácter nulo de terminación, pero se detiene ahí.

Aquí está nuestro uso de la función strstr:

int main(void)

{
	char arr1[100] = "hello world";
	char arr2[100] = "lo";
	char* p = strstr(arr1, arr2);
	printf("%s\n", p);

	return 0;
}

Lo anterior es la búsqueda de la subcadena lo en la cadena de destino hola mundo. Cuando se encuentra, devolverá la cadena a partir de lo y comenzará a imprimir. El resultado debería ser: lo mundo. Entonces, ¿a ver si el resultado es el mismo que imaginamos?

 Los resultados de ejecución son los mismos que imaginamos.

A continuación simulamos la implementación de la función strstr:

//模拟strstr函数

char* my_strstr(const char* p1, const char* p2)
{
	char* ret = p1;
	char* w = p2;
	char* flag = NULL;
	while (*ret != '\0')
	{
		if (*ret == *w)
		{
			flag = ret;
			while (*w != '\0')
			{
				if (*ret != *w)
				{
					w = p2;
					ret = flag;
					flag = NULL;
					break;
				}
				w++;
				ret++;
			}
		}
		ret++;
	}

	return flag;
}

int main(void)
{
	char* arr1[100];
	char* arr2[100];
	gets(arr1);
	gets(arr2);
	char* p = my_strstr(arr1, arr2);
	printf("%s\n", p);

	return 0;
}

Esta función se simula como los parámetros y el valor de retorno de la función strstr, porque necesitamos encontrar la posición de la subfunción correspondiente a la función de destino, por lo que debemos crear un puntero temporal de tipo char* para marcar, y luego use el ciclo while para encontrar la función de destino Lo mismo que el primer contenido de la subfunción, use el puntero recién creado para marcar el primer elemento y luego anide un ciclo para comparar todo el contenido, si todos son iguales, regrese la dirección marcada por el puntero en este momento, si no, devolver el puntero de subfunción Al principio, la función de destino continúa comparándose con la siguiente posición hasta que se encuentra el objetivo, y si no se encuentra el contenido de la subfunción , se devuelve un puntero nulo.

El resultado de la operación es el siguiente:


 función strtok

La función strtok es una función de división de cadenas, que divide una cadena completa de acuerdo con el símbolo de división dado.

1. El parámetro delimitadores es una cadena que define el conjunto de caracteres utilizados como delimitadores.

2. El primer parámetro especifica una cadena que contiene 0 o más tokens separados por uno o más delimitadores en la cadena de separación.

3. La función strtok encuentra la siguiente marca en str, la termina con \0 y devuelve un puntero a esta marca. (Nota: la función strtok cambiará la cadena que se está manipulando, por lo que las cadenas divididas con la función strtok generalmente son contenido copiado temporalmente y se pueden modificar).

4. El primer parámetro de la función strtok no es NULL, la función encontrará la primera marca en str y la función strtok guardará su posición en la cadena.

5. El primer parámetro de la función strtok es NULL, la función comenzará en la posición guardada en la misma cadena y buscará la siguiente marca.

6. Si no hay más tokens en la cadena, se devuelve un puntero NULL.
 

Cuando se llama a la función strtok por primera vez, el carácter encontrado se utilizará como marca. Si pasamos un puntero nulo al primer parámetro cuando llamamos a esta función por segunda vez, la función strtok continuará en la cadena pasada. en la última vez Encuentre el personaje objetivo y segméntelo. Por lo tanto, al usar esta función, se usará en combinación con un bucle for.

Método de uso específico:

int main(void)
{
	char arr[] = "[email protected]";
	char sep[] = "@.";
	char copy[50];
	strcpy(copy, arr);
	char* ret = NULL;
	for (ret = strtok(copy, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}

	return 0;
}

 El resultado de la operación es el siguiente:


 Funciones de biblioteca más rigurosas

Arriba aprendimos las funciones strcpy, strcat, strcmp, todas prestan más atención a '\0', pero no prestan atención a los caracteres adicionales, llamamos a estas funciones funciones de cadena con longitud ilimitada. A continuación, aceptamos algunas funciones de cadena de longitud restringida.

Son las funciones strncpy, strncat y strnmp, que son n más que las funciones aprendidas antes ¿Cuál es la diferencia entre la función prototipo y la anterior?

 

Todos tienen un parámetro más size_t num que el prototipo de función anterior, y este num limita los caracteres requeridos. La función es exactamente la misma que la función anterior.

Entonces, ¿por qué dices que son más rigurosos?

función strncpy

int main(void)
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxxxxxxxxxxxxxxx";
	strncpy(arr1, arr2, 3);

	return 0;
}

 Aunque la cadena en arr2 es muy larga, solo copiamos tres caracteres en arr1.

¿Qué sucede si solo hay tres caracteres en la cadena en nuestro arr2, pero escribimos 5 como el tercer parámetro en strncpy?

 Los restantes serán reemplazados con '\0' hasta que se satisfagan 5 copias.

¡Pero la función strncat es diferente! ! !

función strncat

int main(void)
{
	char arr1[20] = "abcdef'\0'yyyyy";
	char arr2[] = "xxx";
	strncat(arr1, arr2, 5);

	return 0;
}

Debido a que el principio de la función strncat es básicamente el mismo que el de la función strcat, se detendrá y agregará una cadena cuando encuentre '\ 0'. Si damos una cadena normal, será seguida por '\ 0' cuando no puede ver que no hay suficientes cambios de caracteres adicionales, ¡así que usamos esta cadena especial para la depuración!

 

 A partir de esta depuración, podemos ver la diferencia entre strncat y strncpy.A la función strncat no le importa si hay suficientes caracteres, solo agrega los caracteres conocidos y finalmente agrega '\0'.

función strncmp 

La función strncmp tiene la misma función que la función strcmp, es decir, el número de comparaciones está limitado por size_t num, y el uso también es muy simple. Daré un programa:

int main(void)
{
	char arr1[100] = "abdefghigk";
	char arr2[100] = "abdfgiigk";
	printf("%d\n", strncmp(arr1, arr2, 2));
	printf("%d\n", strncmp(arr1, arr2, 4));

	return 0;
}


resumen 

 En general, los que tienen n son más seguros que los que no tienen n, porque limitan el tamaño, estaremos atentos a una serie de cuestiones como si se puede almacenar el espacio del arreglo al usarlo.

Pero bajo un uso normal, los dos tipos de funciones son las mismas, ¡y una persona no puede dejar de escribir errores! ! !


Introducción a la función en ctype.h 

Las funciones en ctype.h son funciones para procesar caracteres, ¡siempre que podamos recordar estas funciones y usarlas juntas! ! !

Las siguientes son algunas funciones importantes en ctype.h:

Función de juicio de carácter:

 función Devuelve verdadero si su argumento cumple las siguientes condiciones
escntrl cualquier personaje de control
es espacio Caracteres de espacio en blanco: espacio ' ', salto de página '\f', salto de línea '\n', retorno de carro '\r', tabulador '\t' o tabulador vertical '\v'
incluso Número decimal 0~9
auto digito Números hexadecimales, incluidos todos los números decimales, letras minúsculas a~f, letras mayúsculas A~F
es bajo letras minúsculas a~z
essuperior Letras mayúsculas A~Z
isalfa Letra a~z o A~Z
la sala de hielo Letra o número, a~z,A~Z,0~9
es puntito Puntuación, cualquier carácter gráfico que no sea un número o una letra (imprimible)
isgrafo cualquier carácter gráfico
pique Cualquier carácter imprimible, incluidos los caracteres gráficos y los espacios en blanco

Función de conversión de caracteres:

int tolower (int c);

int toupper ( int c ); a minúsculas

Método de uso específico: 

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
 {
    c=str[i];
    if (isupper(c))
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;
}

Análisis: convierta los caracteres en minúsculas de una cadena a mayúsculas.

 

 Lo anterior es mi descripción de las funciones básicas de cadenas y funciones de caracteres. Si hay alguna deficiencia para los bloggers, puede dejar un mensaje en el área de comentarios. Los bloggers aprenderán con paciencia. ¡Su apoyo es mi mayor motivación! ! !

 

Supongo que te gusta

Origin blog.csdn.net/m0_74755811/article/details/131698870
Recomendado
Clasificación