Notas de estudio de cadena de lenguaje C (1)

El mejor momento para plantar un árbol es hace diez años, ¡seguido del ahora!

¡He aprendido sobre matrices antes, y creo que ya has escuchado la palabra matriz de caracteres! Aprendamos sobre las constantes de cadena del lenguaje C (llamadas literales de cadena en lenguaje C) y las variables de caracteres.

Uno, literal de cadena

1. Secuencias de escape en cadenas literales

Los literales de cadena también pueden contener secuencias de escape (\ ny otras secuencias de escape). Nota: Las secuencias de escape para números hexadecimales y octales son más complicadas, ¡así que úselas con cuidado!

P.ej:

"hello\nworld\n"

La salida es: hola

                  mundo

2. Continuación de las variables de cadena

A veces, el literal de cadena es demasiado largo para colocarlo en una sola línea, generalmente un \ termina al final, luego el lenguaje C puede continuar escribiendo en la siguiente línea. Pero el efecto de esta sangría no es obvio. Un ejemplo es el siguiente:

#include<stdio.h>
int main(void)
{
	printf("ABCDE\
	FGHI\n");
	
	printf("abcde\
fghi\n");
	printf("123"
	"456\n");
}

Se puede ver que si desea generar la cadena en una fila cuando usa \, no hay forma de garantizar el formato de sangría, por lo que hay una manera de continuar con la cadena literal, es decir, "..." ". .. "dos consecutivos Se pueden combinar en la misma cadena.

3. Almacene la cadena literal:

Esencialmente, el lenguaje C trata los literales de cadena como matrices de caracteres. (¡Pero la matriz de caracteres no es una cadena! ¡La cadena tendrá un \ 0 al final!)

Cuando aparece un literal de cadena de longitud n en lenguaje C, ¡el lenguaje C le asignará un espacio de longitud n + 1! Esta memoria se usa para almacenar los caracteres en el literal de cadena, y el espacio adicional se usa para marcar el carácter adicional (carácter vacío) al final de la cadena. Este \ 0 es el signo del final del literal de cadena, que se escapa Reemplace el carácter \ 0. Nota: en lugar de '0', el valor del código del carácter nulo es 0 y el código ASCII del carácter cero es 48.

Por ejemplo: la cadena literal "abc" se almacena como una matriz con 4 caracteres (a, b, c, \ 0)

          String literal "" (String literal puede estar vacío. Y un solo carácter vacío se almacena como \ 0)

Entonces, ¿qué pasamos cuando usamos cadenas literales para pasar parámetros a la función printf? Dado que se trata como una matriz, el compilador naturalmente lo considera como un puntero de tipo char *.

Por ejemplo: printf ("abc");

          Cuando se llama a la función printf, se pasa la dirección de "abc" (es decir, el puntero a la unidad de memoria que almacena la letra a)

Eche un vistazo al siguiente código y sus resultados en ejecución

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

"" Solo hay un elemento \ 0 en la cadena vacía, que es el entero 0, ¡pero no la constante de carácter '0'! ! !

4. Operación de cadenas literales

Justo ahora vimos este código

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

Generalmente, se pueden usar cadenas literales donde los punteros char * se pueden usar en lenguaje C. Por ejemplo, el literal de cadena puede aparecer en el lado derecho del símbolo de asignación, como char * a arriba, a = "abc" Esta operación de asignación hace que el puntero apunte al primer carácter de la cadena.

El lenguaje C permite subíndices de punteros, por lo que también podemos subíndices de cadenas literales. Por ejemplo, char ch; ch = "abc" [0].

Nota: ¡No modifique la cadena literal! (El literal de cadena se encuentra en un lugar llamado "segmento de código" en el programa, y ​​es de solo lectura, por lo que no hablaré de él aquí)

Dos, variables de cadena

En algunos lenguajes de programación, se proporciona un tipo de datos específicamente para las variables de cadena. En el lenguaje C, generalmente usamos matrices unidimensionales para almacenar cadenas (¡pero recuerde asegurarse de que la cadena termine con un carácter nulo!)

Cuando escribimos funciones de procesamiento de cadenas nosotros mismos, ¡también debemos considerar el manejo de caracteres nulos!

#define STR_LEN 10

  ...

char str [STR_LEN + 1]; // Aquí, STR_LEN se define como 10 enfatizado que str puede almacenar una cadena de hasta 10 caracteres, y luego STR_LEN + 1 se usa para almacenar caracteres nulos en la declaración de la matriz str.

Por supuesto, declarar una matriz de caracteres con una longitud de STR_LEN + 1 no significa que siempre se use para almacenar una cadena con una longitud de STR_LEN. La longitud de la cadena depende de la posición del carácter vacío, en lugar del carácter matriz que almacena la longitud de la cadena. STR_LEN +1 simplemente limita la longitud máxima de la cadena.

1. Inicializar variables de cadena

Se puede inicializar en el momento de la declaración.

char str1[] = "hello world"

Dado que debemos asegurarnos de que la longitud de la matriz sea mayor que la longitud del literal de cadena, podemos omitir su longitud, en este caso el compilador le agregará automáticamente un carácter nulo.

La cadena literal "hola mundo" se copia en la matriz str1, y luego el compilador agrega automáticamente caracteres nulos, de modo que se puede considerar como una variable de cadena.

Por supuesto, hay otros métodos de inicialización, pero recuerde el anterior, el anterior es el más utilizado.

2. Matriz de caracteres y puntero de caracteres

char *a = "hello world"
char a[] = "hello world"

Estas dos declaraciones parecen ser lo mismo: la primera declara un puntero a, y la segunda declara una matriz a. Ambas pueden considerarse cadenas. Sin embargo, existe una gran diferencia entre los dos y no podemos pensar que los dos anteriores sean intercambiables.

Al declararlo como puntero, no podemos modificar el literal de cadena. (Recuerde el fragmento de código en el área de solo lectura mencionada anteriormente)

Nota: ¡La variable de puntero debe inicializarse antes de su uso!

3. Uso de las funciones put (), gets (), printf (), scanf (), fgets ().

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_51182221/article/details/115217465
Recomendado
Clasificación