Tabla de contenido
- 0 Introducción
- 1 conceptos básicos de cuerdas
- longitud de 2 cuerdas
- 3 funciones de cadena sin restricciones
- 4 funciones de cadena de longitud limitada
- 5 conceptos básicos de la búsqueda de cadenas
- 6 Búsqueda avanzada de cadenas
- 7 mensajes de error
- 8 operaciones de caracteres
- 9 operaciones de memoria
- 10 Resumen
0 Introducción
En el lenguaje C, las cadenas y las matrices tienen muchas similitudes y se proporcionan muchas funciones de biblioteca oficiales para llamar. Entonces, ¿qué tipo de relación cercana tienen las hermanas cadenas y matrices? Como nuestro personaje clave en este número, ¿qué tienen de especial las cadenas?
El lenguaje C no tiene un tipo de datos de cadena explícito, porque las cadenas aparecen como constantes de cadena o se almacenan en matrices de caracteres. Las constantes de cadena son adecuadas para cadenas que el programa no modifica. Todas las demás cadenas deben almacenarse en matrices de caracteres o en memoria asignada dinámicamente .
Este artículo se centra en presentar algunas funciones de biblioteca de uso común para cadenas, para que todos puedan elegir la función de biblioteca más adecuada en diferentes situaciones. La siguiente es una descripción general del contenido de este artículo.
1 conceptos básicos de cuerdas
Una cadena es una secuencia 0个
de caracteres que termina en un byte cuyo 多个
patrón de bits es todo . Por ejemplo:0
NUL
char message[] = "hello word";
longitud de 2 cuerdas
La longitud de una cadena es la cantidad de caracteres que contiene, excluyendo el último terminador . Esto se comprobará a menudo durante las entrevistas.
La longitud de una cadena se puede calcular automáticamente mediante la función de biblioteca strlen().
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message[] = "hello word";
printf("字符串的长度为:%d\n",strlen(message));
system("pause");
return 0;
}
Salida de impresión:
Cabe señalar que esta función devuelve un número sin signo, por lo que debe prestar especial atención al comparar las longitudes de dos cadenas a través de esta función:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello word";
char message2[] = "hello Shanghai";
//比较方式1
if(strlen(message1) >= strlen(message2))
printf("字符串1更长\n");
else
printf("字符串2更长\n");
//比较方式2
if (strlen(message1) - strlen(message2) >= 0)
printf("字符串1更长\n");
else
printf("字符串2更长\n");
system("pause");
return 0;
}
Salida de impresión:
debido a que se devuelve un número sin signo, entoncesMétodo de comparación 2, el resultado del juicio condicional siempre es verdadero, lo que genera errores en el resultado del juicio.
3 funciones de cadena sin restricciones
La llamada función de cadena sin restricciones significa que cuando se usa, no es necesario especificar la longitud de la cadena (parámetro real) y la función se puede ejecutar sin problemas.
3.1 Copiar cadena
La copia de cadenas se utiliza a menudo en el desarrollo, pero cuando se copia a una nueva cadena, la parte original se sobrescribirá, por lo que se requiere atención especial.
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello word";
char message2[] = "hello Shanghai";
int message2_len = strlen(message2);
printf("字符串2的长度为:%d\n", strlen(message2));
strcpy(message2,message1);
printf("字符串2的长度为:%d\n",strlen(message2));
for(int i = 0; i < message2_len; i++)
printf("%c",message2[i]);
system("pause");
return 0;
}
Salida de impresión:
Puedes ver que después de message1
copiar la cadena en message2
, message2
las longitudes en realidad son diferentes. ¿A qué se debe esto?
Esto se debe a que al copiar la cadena, el terminador también se copia. Cuando strlen()
se procesa la función, definitivamente regresará 10
. A juzgar por los resultados impresos, message2
el resto de la cadena aún se conserva.
Al copiar una cadena más larga en una cadena más corta, a menudo se informa un error porque no hay suficiente espacio para acomodar los caracteres que se deben copiar.
3.2 Cadena de conexión
Al concatenar cadenas, puede utilizar la función strcat(). Su prototipo es el siguiente:
char *strcat(char *dst, char const *src);
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello word";
char message2[] = "hello Shanghai";
strcat(message1,message2);
printf("%s\n", message1);
system("pause");
return 0;
}
Salida de impresión:
puede ver que las dos cadenas están directamente concatenadas. El valor de longitud de la nueva cadena es la suma de las longitudes de las dos cadenas originales .
3.3 Valor de retorno de la función
El valor de retorno de estas funciones a veces es una copia del primer parámetro, por lo que se puede anidar, porque cuando se usa una cadena como parámetro real, también se pasa la dirección del primer elemento. Por lo tanto, estas funciones a menudo pueden denominarse anidadas.
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello ";
char message2[] = "word ";
char message3[] = "Shanghai";
strcat(strcat(message1, message2), message3);
printf("%s\n", message1);
system("pause");
return 0;
}
Salida de impresión:
pero para la legibilidad del programa, está bien no anidar.
3.4 Comparación de cadenas
Para la comparación de cadenas, solo hay una función de biblioteca de uso común, es decir strcmp
. Su prototipo es el siguiente:
int strcmp(char const *s1, char const *s2);
Las reglas de comparación de esta función son bastante interesantes. Esta función compara los caracteres de dos cadenas uno por uno hasta que se encuentra una discrepancia. Aquí hay dos situaciones:
- La cadena que contiene el carácter con la clasificación ASCII más alta entre los primeros caracteres no coincidentes se considera la cadena más pequeña;
- Si ambas cadenas al principio son iguales, la cadena más corta se considera la más pequeña.
Si se encuentra un determinado carácter no coincidente en la cadena, el resultado de la comparación se puede obtener sin comparar las partes restantes.
Como se muestra a continuación:
Mire el código real:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char temp1[] = "hello";
char temp2[] = "hello world";
char temp3[] = "hello worLd";
//字符串temp1和temp2作比较
if(strcmp(temp1,temp2) == 0)
{
printf("temp1 = temp2\n");
}
else if (strcmp(temp1, temp2) > 0)
{
printf("temp1 > temp2\n");
}
else if (strcmp(temp1, temp2) < 0)
{
printf("temp1 < temp2\n");
}
printf("------------------\n");
//字符串temp2和temp3作比较
if (strcmp(temp2, temp3) == 0)
{
printf("temp2 = temp3\n");
}
else if (strcmp(temp2, temp3) > 0)
{
printf("temp2 > temp3\n");
}
else if (strcmp(temp2, temp3) < 0)
{
printf("temp2 < temp3\n");
}
printf("\n");
system("pause");
return 0;
}
Imprimir:
4 funciones de cadena de longitud limitada
Al llamar a algunas funciones de biblioteca, es necesario pasar la longitud de la cadena que se va a procesar, por lo que se denominan funciones de cadena de longitud limitada.
Estas funciones proporcionan un mecanismo conveniente para evitar que cadenas largas e impredecibles desborden sus matrices de destino.
Hay varias funciones comunes:
char *strncpy(char *dst, char const *src, size_t len);
char *strncat(char *dst, char const *src, size_t len);
int strncmp(char const *s1, char const *s2, size_t len);
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello ";
char message2[] = "hello Beijing ";
char message3[] = "Shanghai";
char message_all[] = "hello Beijing Shanghai";
if(strncmp(strncpy(strncat(message2, message3, strlen(message3)), message1, strlen(message1)), message_all,strlen(message_all)) == 0)
printf("二者相等\n");
else
printf("二者不相等\n");
system("pause");
return 0;
}
Impresión:
Este ejemplo no es muy apropiado. Debido a que la longitud se pasa según el máximo, también puede explicar el problema.
5 conceptos básicos de la búsqueda de cadenas
Hay muchas funciones en la biblioteca estándar que utilizan varios métodos para buscar cadenas. Estas diversas herramientas brindan a los programadores de C una gran flexibilidad.
5.1 Encuentra una cadena
Hay dos funciones de biblioteca disponibles para buscar caracteres específicos en una cadena.
char *strchr(char const *str, int ch);
char **strrchr(char const *str, int ch);
El primero se utiliza para encontrar un personaje determinado.primeroLa posición donde ocurre (devuelve un puntero a la dirección), que se utiliza para encontrar un carácter.la última vezLa ubicación donde esto ocurre (devuelve un puntero a esa dirección).
Estas dos funciones se pueden utilizar así:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message1[] = "hello ";
char message2[] = "hello Beijing ";
char message3[] = "Shanghai";
char message_all[] = "hello Beijing Shanghai";
char *first_site, *last_site;
first_site = strchr(message_all, 'h');
last_site = strrchr(message_all, 'h');
printf("字符串的长度是:%d\n",strlen(message_all));
printf("h第一次出现的位置是:%d\n", first_site - message_all);
printf("h最后一次出现的位置是:%d\n", last_site - message_all);
system("pause");
return 0;
}
Salida de impresión:
Cabe señalar que esta función no devuelve el valor de la posición del elemento de destino, sino el puntero, por lo que debe ser diferente del puntero del primer elemento de la cadena para obtener el resultado.
Nota: La búsqueda distingue entre mayúsculas y minúsculas.
5.2 Encuentra algunos caracteres
strpbrk
es una función más común que se utiliza para encontrar la primera aparición de cualquier carácter en una cadena en la cadena de destino. Su prototipo es el siguiente:
char *strpbrk(char const *str, char const *group);
Se puede utilizar así:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message_all[] = "hello Beijing Shanghai";
char *first_site;
first_site = strpbrk(message_all, "abcde");
printf("字符串的长度是:%d\n",strlen(message_all));
printf("abcde第一次出现匹配字符的位置是:%d\n", first_site - message_all);
system("pause");
return 0;
}
Salida de impresión:
es fácil ver que el primer carácter coincidente es e
y la posición es 1
.
5.3 Encuentra una subcadena
Para encontrar una subcadena en una cadena, podemos usar la función strstr, cuyo prototipo es el siguiente:
char *strstr(char const *s1, char const *s2);
Para dar un ejemplo en uso real:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char message_all[] = "hello Beijing Shanghai";
char *first_site;
first_site = strstr(message_all, "Beijing");
printf("字符串的长度是:%d\n",strlen(message_all));
printf("Beijing第一次出现的位置是:%d\n", first_site - message_all);
system("pause");
return 0;
}
Salida de impresión:
Se puede ver que en esta búsqueda, todos los caracteres deben coincidir, no ciertos caracteres o parciales.
6 Búsqueda avanzada de cadenas
El siguiente conjunto de funciones simplifica el proceso de buscar y extraer una subcadena desde el principio de una cadena.
6.1 Encuentra un prefijo de cadena
strspn
y strcspn
las funciones se utilizan para contar cadenas en sus posiciones iniciales en la cadena, y sus prototipos son los siguientes:
size_t strspn( char const *str, char const *group);
size_t strcspn( char const *str, char const *group);
Cabe señalar que estas dos funciones no devuelven punteros de elementos, sino el número real de caracteres coincidentes.
Para un uso específico, vea un ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int len1, len2;
char buffer[] = "25,142,330,smith,J,239-4123";
len1 = strspn(buffer, "0123456789");
len2 = strcspn(buffer, ",");
printf("0123456789的起始匹配数是:%d\n", len1);
printf(",的起始不匹配数是:%d\n", len2);
system("pause");
return 0;
}
Salida de impresión:
como se puede ver en el ejemplo anterior, strspn
la función comienza desde el principio para buscar caracteres que coincidan con la cadena que está buscando hasta que no se puede encontrar. En este ejemplo, ,
ya no es adecuado, por lo que en el caso de una búsqueda continua, solo 2
uno es adecuado.
La función strcspn es todo lo contrario, lo que busca no es consistente, el 2 y el 5 del principio obviamente no coinciden, pero son ,
consistentes, por lo tanto, en el caso de búsqueda continua, hay uno adecuado 2
.
6.2 Encontrar marca
Una cadena a menudo contiene varias partes separadas entre sí. Cada vez, para procesar estas piezas, primero hay que extraerlas de la cuerda.
La función strtok puede lograr tal función. Aísla partes individuales llamadas tokens de la cadena. y descartar el delimitador. Su prototipo es el siguiente:
char *strtok( char *str, char const *sep);
Aviso:
- Cuando la función strtok realiza su tarea, modifica la cadena que procesa. Si la cadena fuente no se puede modificar, haga una copia y pásela a la función strtok.
- Si el primer parámetro de la función strtok no es NULL, la función encontrará el primer token de la cadena. strtok también guardará su posición en la cadena. Si el primer parámetro de la función strtok es NULL, la función busca el siguiente token en la misma cadena comenzando desde la posición guardada como antes.
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int add = 0;
char buffer[] = "25,142,330,smith,J,239-4123";
char *token = NULL;
for (token = strtok(buffer, ","); token != NULL; token = strtok(NULL, ","))
{
printf("%s\n", token);
add++;
}
printf("--------------------------\n");
printf("add的值为:%d\n",add);
system("pause");
return 0;
}
Salida de impresión:
como se puede ver en el ejemplo anterior, utilizando la marca que necesitamos encontrar como límite, cada bucle obtendrá una subcadena dividida hasta que se completen todas las divisiones. Tiempos divididos 6
en total.
7 mensajes de error
errno
Cuando una función de la biblioteca de lenguaje C no se ejecuta, habrá un código de error (0 1 2 3 4 5 6 7 8 9...) El sistema operativo informa el código de error configurando una variable entera externa. En otras palabras, un código de error corresponde a un tipo de error. strerror
La función toma uno de los códigos de error como parámetro y devuelve un puntero aPuntero a una cadena que describe el error.. El prototipo de esta función es el siguiente:
char *strerror(int error_number);
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
for(int i = 0; i < 10; i++)
printf("%s\n",strerror(i));
system("pause");
return 0;
}
Salida de impresión:
se puede ver que diferentes códigos de operación corresponden a diferentes tipos de error, y el código de error 0
indica que no hay ningún error. Otros indican varios errores. Solo entiende esta parte. No se requiere masterización. No es necesario saber qué error representa cada código de operación.
8 operaciones de caracteres
La biblioteca estándar contiene dos conjuntos de funciones para manipular caracteres individuales y sus prototipos se encuentran en el archivo de encabezado ctype.h. El primer conjunto de funciones se utiliza para clasificar cadenas, mientras que el segundo conjunto de funciones se utiliza para convertir caracteres.
8.1 Clasificación de personajes
Cada función de clasificación acepta un parámetro entero que contiene un valor de carácter. La función prueba este carácter y devuelve un valor entero que representa verdadero o falso. La siguiente tabla enumera cada función y las condiciones necesarias para que sea verdadero.
función | Condiciones requeridas para volver verdadero |
---|---|
iscntrl | personajes de control |
isespacio | Caracteres de espacio en blanco: espacio, avance de página '\f', avance de línea '\n', retorno de carro '\r', tabulación 't' o tabulación vertical '\v' |
incluso | número decimal |
auto dígito | Números hexadecimales, incluidas letras mayúsculas y minúsculas a~f |
es bajo | Letras minusculas |
es superior | letra mayúscula |
isalfa | Letras (mayúsculas o minúsculas) |
la sala de hielo | letras o números |
puntual | Cualquier carácter gráfico (símbolo imprimible) que no sea un número o una letra. |
isgrafo | cualquier personaje gráfico |
pique | Cualquier carácter imprimible, incluidos caracteres gráficos y espacios en blanco. |
Entonces estas funciones se usan para determinar elementos de cadena, por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char temp[] = "To carry things with great virtue";
for (int i = 0; i < strlen(temp); i++)
{
if (islower(temp[i]))
printf("temp[%d] : %c是小写字母\n", i, temp[i]);
else if (isupper(temp[i]))
printf("temp[%d] : %c是大写字母\n", i, temp[i]);
else if(isspace(temp[i]))
printf("temp[%d] : %c是空格\n", i, temp[i]);
}
printf("\n");
system("pause");
return 0;
}
Salida de impresión:
puede ver que se ha temp
determinado si cada elemento es una letra mayúscula, una letra minúscula o un espacio.
8.2 Conversión de caracteres
Las funciones de conversión convierten letras mayúsculas en minúsculas o letras minúsculas en mayúsculas. Hay dos funciones para llamar. toupper
retorno de funciónLa forma mayúscula correspondiente de sus parámetros., tolower
la función regresaLa forma minúscula correspondiente a su parámetro.。
int tolower(int ch);
int toupper(int ch);
Dé un ejemplo práctico:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char temp1[] = "To carry things with great virtue";
char temp2[] = "To carry things with great virtue";
//全转换为大写
for (int i = 0; i < strlen(temp1); i++)
{
if (islower(temp1[i]))
temp1[i] = toupper(temp1[i]);
printf("%c",temp1[i]);
}
printf("\n-----------------------------\n");
//全转换为小写
for (int i = 0; i < strlen(temp2); i++)
{
if (isupper(temp2[i]))
temp2[i] = tolower(temp2[i]);
printf("%c", temp2[i]);
}
printf("\n");
system("pause");
return 0;
}
Salida de impresión:
Como puede ver, podemos ajustar el uso de mayúsculas en la cadena según nuestros propios deseos.
9 operaciones de memoria
Las cadenas generalmente terminan en NUL, pero si queremos procesar cadenas que contienen NUL en el medio, o secuencias de bytes de cualquier longitud, las funciones anteriores son relativamente débiles o no se pueden usar en absoluto. Sin embargo, podemos tener otro conjunto de funciones para usar para completar algunas necesidades en el desarrollo real. A continuación se muestran sus prototipos.
Nota: Estas funciones pueden manejar no sólo cadenas, sino tambiénEstructuraoformacióny otros tipos de datos. Los tipos de datos específicos que se pueden procesar dependen de las funciones específicas.
void *memcpy(void *dst, void const *src, size_t length);
void *memmove(void *dst, void const *src, size_t length);
void *memcmp(void const *a, void const *b, size_t length);
void *memchr(void const *a, int ch, size_t length);
void *memset(void *a, int ch, size_t length);
Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
char temp1[] = "hello world";
char temp2[] = "hello world";
char temp3[] = "hello world";
char temp4[] = "hello world";
unsigned int int_array[SIZE];
char *p = NULL;
//复制字符串
memcpy(temp1 + 2, temp1, 5);
memmove(temp2 + 2, temp2, 5);
printf("temp1 = %s\n", temp1);
printf("temp2 = %s\n", temp2);
printf("---------------------------------------\n");
//比较字符串
if(!memcmp(temp1, temp2, 6))
printf("temp1 = temp2\n");
else
printf("temp1 != temp2\n");
printf("---------------------------------------\n");
//查找字符
p = (char *)memchr(temp3, 'e', strlen(temp3));
if(p != NULL)
printf("字符e在temp3中的位置是:%d\n", p - &temp3[0]);
printf("---------------------------------------\n");
//初始化数组
memset(int_array, 0, sizeof(int_array));
for (int i = 0; i < SIZE; i++)
printf("int_array[%d]的值为:%d\t", i, int_array[i]);
printf("\n", sizeof(int));
printf("---------------------------------------\n");
//初始化数组
memset(temp4, 'a', sizeof(temp4) - 1);
printf("字符串temp4为:%s\n", temp4);
system("pause");
return 0;
}
Imprimir:
9.1 ¿Memcpy y memmove son realmente diferentes?
Hay una pregunta que vale la pena discutir: ¿
las funciones memcpy y memmove son realmente iguales? "C y punteros" y muchas opiniones en Internet son: los dos son diferentes. Si src y dst se superponen, memcpy tendrá problemas, mientras que memmove siempre se puede ejecutar en condiciones ideales, pero los resultados de nuestro programa no son Sí, ambos Las funciones funcionan idealmente. ¿Por qué?
La única explicación es,El entorno de ejecución del software es diferente y la biblioteca subyacente del programa es diferente, por lo que ocurrirá esta situación.. ¡Pero esto no afecta nuestra investigación sobre las versiones anteriores (es decir, las dos son diferentes) de memcpy y memmove!
Primero echemos un vistazo a lo que significa superposición y por qué la copia de cadenas puede causar problemas cuando hay superposición.
Lo anterior es un diagrama esquemático de la operación de copia de cadenas en nuestro programa. Puede ver que tres letras de la subcadena src y la subcadena dst se superponen, si seguimos el método de operación convencional, aparecerá el siguiente resultado después de copiar.
Si las áreas se superponen, provocará un error de copia, es decir, el valor deseado se reemplaza por el nuevo valor.cubrir, lo que provocó que el valor no se pudiera obtener sin problemas, temp1
se convirtió después de copiarlo hehehehorld
. Así es memcpy
como se copió la cadena antes.
Luego, echemos un vistazo memmove
(y optimicemos memcpy
) cómo resolver este problema claramente.
Como puede ver, el orden de copia ha cambiado, esta vez se copia de atrás hacia adelante, lo que evita bien este problema.
Entonces aquí viene la pregunta, esta vez el destino a copiar está al final, ¿qué debemos hacer si está al frente? La respuesta es que el orden de copia también se invierte. Eche un vistazo al proceso de ejecución:
en este momento, el valor a tomar no será sobrescrito por el valor original, se ejecutará de acuerdo con el resultado esperado, el resultado es: llo w world
.
9.2 memcmp: comparación simple
memcmp
Compare los primeros bytes de longitud del área de memoria ay. El método de comparación y el valor de retorno son strcmp
básicamente los mismos. Para obtener más información, consulte la sección de este artículo strcmp
.
9.3 memchr: búsqueda simple
memchr busca la primera aparición del carácter ch comenzando desde la posición inicial de a y devuelve un puntero a esa posición. El método de búsqueda y el valor de retorno son strchr
básicamente los mismos. Para obtener más información, consulte la sección de este artículo strchr
.
9.4 memset: ¿Los valores inicializados solo pueden ser 0 y -1?
A juzgar por la introducción de esta función, esta función puede establecer el mismo valor (teóricamente) para un área de memoria continua , pero en el desarrollo real, básicamente se establece en 0
o -1
¿Por qué?
Esto se debe a que esta función asigna valores a la memoria en bytes, generalmente se usa para asignar valores a cadenas sin ningún problema, porque los elementos de las cadenas solo ocupan un byte, pero los arrays son diferentes, comunes short, int, long. Los elementos de la matriz de tipo tienen más de un byte, por lo que la inicialización no producirá los resultados que esperábamos. Cuando lo configuramos en 0, cada byte es 0 (si es -1, entonces cada bit es 1), por lo que cada elemento se inicializará a 0 sin importar cuántos bytes tenga, pero para otros valores, el resultado no ser el mismo. Mismo. Consulte los siguientes procedimientos:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
unsigned int int_array[SIZE];
//初始化数组
printf("--------------初始化值设为0-------------------------\n");
memset(int_array, 0, sizeof(int_array));
for (int i = 0; i < SIZE; i++)
printf("int_array[%d]的值为:%d\t", i, int_array[i]);
printf("\n");
printf("--------------初始化值设为1-------------------------\n");
memset(int_array, 1, sizeof(int_array));
for (int i = 0; i < SIZE; i++)
printf("int_array[%d]的值为:%d\t", i, int_array[i]);
printf("\n");
system("pause");
return 0;
}
Impresión:
¿Por qué es esto?
Esto se debe a que el memset
valor se asigna en bytes y int
el tipo de datos ocupa 4
3 bytes en la memoria, por lo que el valor debe estar en 4
bytes, es decir: 0x01010101
convertido a decimal es exactamente 16843009
.
Por lo tanto, generalmente si desea memse
establecer el mismo valor para un área de memoria, inicializar en 0
o -1
es la mejor opción.
10 Resumen
La cadena en sí no es muy complicada. Para facilitar el desarrollo, se proporcionan muchas funciones de biblioteca, por lo que solo necesitamos dominar esas funciones de biblioteca en lenguaje C. En particular, tenga en cuenta que algunas funciones no devuelven valores numéricos, sino punteros; algunas funciones son más especiales de usar, como strtok
etc.
-------------------------------------------------- ----------------------fin--------------------------- ----------------------------------------------