Notas de lectura de "C y punteros" (Capítulo 9 Cadenas, caracteres y bytes)

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.

Insertar descripción de la imagen aquí

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:0NUL

	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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
Puedes ver que después de message1copiar la cadena en message2, message2las 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, message2el 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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
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:

  1. 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;
  2. 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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí

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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
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

strpbrkes 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:
Insertar descripción de la imagen aquí
es fácil ver que el primer carácter coincidente es ey 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:
Insertar descripción de la imagen aquí
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

strspny strcspnlas 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:
Insertar descripción de la imagen aquí
como se puede ver en el ejemplo anterior, strspnla 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 2uno 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:

  1. 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.
  2. 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:
Insertar descripción de la imagen aquí
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 6en total.

7 mensajes de error

errnoCuando 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. strerrorLa 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:
Insertar descripción de la imagen aquí
se puede ver que diferentes códigos de operación corresponden a diferentes tipos de error, y el código de error 0indica 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:
Insertar descripción de la imagen aquí
puede ver que se ha tempdeterminado 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. toupperretorno de funciónLa forma mayúscula correspondiente de sus parámetros., tolowerla 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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí

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.
Insertar descripción de la imagen aquí
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.
Insertar descripción de la imagen aquí
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, temp1se convirtió después de copiarlo hehehehorld. Así es memcpycomo se copió la cadena antes.

Luego, echemos un vistazo memmove(y optimicemos memcpy) cómo resolver este problema claramente.
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
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

memcmpCompare los primeros bytes de longitud del área de memoria ay. El método de comparación y el valor de retorno son strcmpbá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 strchrbá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 0o -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: Insertar descripción de la imagen aquí
¿Por qué es esto?

Esto se debe a que el memsetvalor se asigna en bytes y intel tipo de datos ocupa 43 bytes en la memoria, por lo que el valor debe estar en 4bytes, es decir: 0x01010101convertido a decimal es exactamente 16843009.

Por lo tanto, generalmente si desea memseestablecer el mismo valor para un área de memoria, inicializar en 0o -1es 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 strtoketc.

-------------------------------------------------- ----------------------fin--------------------------- ----------------------------------------------

Supongo que te gusta

Origin blog.csdn.net/weixin_43719763/article/details/130913227
Recomendado
Clasificación