✨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.
Directorio de artículos
Funciones de cadena de longitud limitada
fuerte
char * strncpy ( char * destination, const char * source, size_t num );
- 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.
- Copia números de caracteres de la cadena de origen al espacio de destino.
- 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:
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:
¿Después de que la copia esté completa?
¡Podemos ver claramente que cuando el contenido no es suficiente, se complementará con '\0'!
strncat
char * strncat ( char * destination, const char * source, size_t num );
- Agrega los primeros números de caracteres del origen al destino, más un carácter nulo de terminación.
- 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:
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:
Después de agregar:
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
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;
}
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
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;
}
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.
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
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;
}
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
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));
}
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;
}
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;
}