[Lenguaje C] Función de cadena

✨Autor: @persona ordinaria 1

✨Columna: "Lenguaje C de 0 a 1"

✨Una frase: todo lo pasado es un prólogo

✨Descripción: El pasado es irreversible, el futuro se puede cambiar


Hemos aprendido 4 funciones antes: strlen\strcpy\strcat\strcmp. La longitud de estas funciones es ilimitada. Hoy, naturalmente, queremos presentar algunas otras funciones. El contenido puede ser relativamente grande.

Funciones de cadena de longitud limitada

fuerte

imagen-20220707091932481

char * strncpy ( char * destination, const char * source, size_t num );
  1. Copia los primeros números de caracteres del origen al destino. Si se encuentra el final de la cadena C de origen (que se indica mediante un carácter nulo) antes de que se haya copiado el número de caracteres, el destino se rellena con ceros hasta que se haya escrito un total de números de caracteres.
  2. Copia números de caracteres de la cadena de origen al espacio de destino.
  3. Si la longitud de la cadena de origen es inferior a num, después de copiar la cadena de origen, agregue 0 al final de la cadena de destino hasta num.

Ahora, hagamos una prueba simple:

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr1[20] = "abcdef";
	char arr2[] = "hello world";
	strncpy(arr1, arr2, 5);
	printf("%s\n", arr1);
	return 0;
}

correr:imagen-20220707093803269

Veamos lo anteriorpunto 3:

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr1[20] = "abcdef";
	char arr2[] = "ghi";
	strncpy(arr1, arr2, 5);//arr2只有3个这里却要拷贝5个,这是怎么一回事呢
	printf("%s\n", arr1);
	return 0;
}

F10 depuración para ver cómo se ven arr1 y arr2 antes de copiar:imagen-20220707094657476

¿Después de que la copia esté completa?imagen-20220707094744118

¡Podemos ver claramente que cuando el contenido no es suficiente, se complementará con '\0'!

strncat

imagen-20220707095134661

char * strncat ( char * destination, const char * source, size_t num );
  1. Agrega los primeros números de caracteres del origen al destino, más un carácter nulo de terminación.
  2. Si la longitud de la cadena C en fuente es menor que num, solo se copia el contenido hasta el carácter nulo final.
#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr1[20] = "hello\0xxxxx";
	printf("%s\n", arr1);
	char arr2[] = "world";
	strncat(arr1, arr2, 3);
	printf("%s\n", arr1);
	return 0;
}

Todos conocemos el resultado, entonces, ¿cómo es el proceso? Vamos a depurar y echar un vistazo: antes de añadir:

Después de agregar:imagen-20220707095641466

Podemos ver claramente que se agregará automáticamente un '\0' al final

¿Qué sucede si la longitud del apéndice es mayor que él mismo? ¿Compondrá tantos '\0' como strncpy? Prueba un fragmento de código:

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr1[20] = "hello\0xxxxx";
	printf("%s\n", arr1);
	char arr2[] = "abc";
	strncat(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

Antes de agregar:imagen-20220707100015102

Después de agregar:imagen-20220707100040572

La respuesta es no, simplemente agregue un '\0'. A través de un simple análisis, probablemente también conozcamos el principio de strncat.

strncmp

imagen-20220707100258557

int strncmp ( const char * str1, const char * str2, size_t num );

Compare hasta que otro carácter sea diferente o una cadena termine o se comparen todos los caracteres numéricos.

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);
	if (ret == 0)
	{
    
    
		printf("==\n");
	}
	else if (ret < 0)
	{
    
    
		printf("<\n");
	}
	else
	{
    
    
		printf(">\n");
	}
	return 0;
}

imagen-20220707101140742

De hecho, si estas funciones tienen más n, habrá más restricciones de longitud, y no hay mucha diferencia.Las funciones de cadena de longitud restringida hacen que el código sea más riguroso, y tratamos de usarlas tanto como sea posible.

búsqueda de cadenas

callestr

imagen-20220707101413372

char * strstr ( const char *str1, const char * str2);

Devuelve un puntero a la primera aparición de str2 en str1, o un puntero nulo si str2 no forma parte de str1.

Entendimiento simple, esta función es una función de encontrar subcadenas

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char email[] = "[email protected]";
	char substr[] = "eichang";
	char*ret = strstr(email, substr);
	if (ret == NULL)
	{
    
    
		printf("子串不存在\n");
	}
	else
	{
    
    
		printf("%s\n", ret);
	}
	return 0;
}

imagen-20220707101942440

El punto no es cómo usarlo, ¡el punto es cómo simularlo!

Implementación simulada de strstr

Hablemos primero del proceso de búsqueda:

Se puede dividir en dos casos para ilustrar:

Uno es el caso simple: una coincidencia encuentra

La otra es una situación más complicada: no se encuentra la primera coincidencia, se debe registrar la posición actual y la coincidencia continúa, se debe buscar muchas veces para encontrarla.

imagen-20220707103859541

La siguiente es una implementación de simulación simple:

#include <assert.h>
#include <stdio.h>
char*my_strstr(const char*str1,const char*str2)
{
    
    
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	while (*p)
	{
    
    
		s1 = p;
		s2 = str2;
		while (*s1!='\0'&&*s2!='\0'&&* s1 == *s2)
		{
    
    
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
    
    
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

int main()
{
    
    
	char email[] = "[email protected]";
	char substr[] = "eichang";
	//char*ret = strstr(email, substr);
	char* ret = my_strstr(email, substr);
	if (ret == NULL)
	{
    
    
		printf("子串不存在\n");
	}
	else
	{
    
    
		printf("%s\n", ret);
	}
	return 0;
}

La búsqueda de subcadenas se puede implementar mediante el algoritmo KMP, pero es más complicado y no se explicará aquí.

strtok

imagen-20220707105048477

char * strtok ( char * str, const char * sep );

El parámetro sep es una cadena que define el conjunto de caracteres que se utilizarán como separadores.

El primer argumento especifica una cadena que contiene cero o más tokens separados por uno o más delimitadores en la cadena sep.

La función strtok encuentra el siguiente token en str, lo termina con \0 y devuelve un puntero a este token. (Nota: la función strtok cambiará la cadena que se está manipulando, por lo que la cadena segmentada por la función strtok generalmente es el contenido de una copia temporal y se puede modificar).

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

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

Devuelve un puntero NULL si no existen más tokens en la cadena.

Creo que es una función extraña, pero no impide que sepamos que corta hilos.

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	const char* sep = "@.";
	char email[] = "[email protected]";
	char cp[30] = {
    
     0 };
	strcpy(cp, email);

	char*ret = strtok(cp, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

imagen-20220707105512359

Cómo conectarse con for loop❓

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	const char* sep = "@.";
	char email[] = "[email protected]";
	char cp[30] = {
    
     0 };
	strcpy(cp, email);

	char* ret = NULL;
	for (ret = strtok(cp, sep); ret != NULL; ret = strtok(NULL, sep))
	{
    
    
		printf("%s\n", ret);
	}
	return 0;
}

informe de mensaje de error

estruendo

imagen-20220707105848512

char * strerror ( int errnum );

Devuelve el código de error y el mensaje de error correspondiente.

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));
}

imagen-20220707110144327

Estos no requieren que recordemos que un código de error global establecido por el lenguaje error-C se almacena en la variable

por ejemplo:

#include <stdio.h>
#include <string.h>
int main()
{
    
    
    FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	else
	{
    
    

	}

    return 0;
}

imagen-20220707110347132

función de clasificación de caracteres

Estas funciones son bastante numerosas y dispersas, y no daré ejemplos una por una, aquí puedes conocerlas y practicarlas tú mismo:

La función devuelve verdadero si sus argumentos cumplen las siguientes condiciones

iscntrl cualquier carácter de control

isspace 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'

isdigit Dígitos decimales 0~9 isxdigit Dígitos hexadecimales, incluidos todos los dígitos decimales, letras minúsculas a f, letras mayúsculas A F

islower letras minúsculas a~z

isletras mayúsculas A ~ Z

isalpha letra a z o A Z

isalnum letras o números, a z, A Z, 0~9

es un signo de puntuación, cualquier carácter gráfico que no sea un número o una letra (imprimible)

isgrafiar cualquier carácter gráfico

es imprimir cualquier carácter que se pueda escribir, incluidos los caracteres gráficos y los espacios en blanco

#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;
}

imagen-20220707111234962


Supongo que te gusta

Origin blog.csdn.net/weixin_60478154/article/details/125655565
Recomendado
Clasificación