Conocimiento en frío de C ++ (actualización gradual)

1. Entrada y salida

4 métodos de entrada y salida

  1. scanf y printf
  2. cin y cout
  3. pone consigue
  4. getchar putchar

3 4 son para caracteres, 3 para cadenas y 4 para caracteres individuales.

1. Carácter único

Al ingresar un solo carácter en el método 1 4 , los espacios y los retornos de carro serán absorbidos y contados como un carácter.
scanf("%c",&ch);         ch=getchar();
Al ingresar un solo carácter en el modo 3, el cin>>chretorno de carro y los caracteres de espacio no se absorberán y se filtrarán.

2. Cadena

El efecto es el mismo cuando se lee una cadena de caracteres en el método 1 2. Se detiene cuando encuentra un espacio de retorno de carro, es decir, no habrá retorno de carro ni espacio en la cadena de lectura.
scanf("%s",str);        cin>>str;
Al leer una cadena de caracteres en el modo 3, el espacio también se contará como parte del carácter y se detendrá solo cuando llegue a un retorno de carro. gets(str);
De la misma manera, tanto scanf como cout deben ajustarse manualmente cuando se imprimen, y las opciones put pueden ajustarse automáticamente.

Discriminación : cadena y matriz de caracteres

int main()
{
    
    
    char ch[20],str[20];
    for (int i = 0; i < 10; ++i)  cin>>ch[i];   字符数组
    cin>>str;  字符串

    for (int i = 0; i < 10; ++i)  cout<<ch[i];
    cout<<endl;
    cout<<str<<endl;
    return 0;
}

La cadena tiene más marcas '\ 0' que la matriz de caracteres, y '\ 0' también ocupará la posición de la matriz definida por el usuario. Pero al calcular la longitud de la matriz, no se considerará '\ 0'.

Métodos de salida comunes de la matriz de cadenas:
1. Recorrido uno por uno
int len=strlen(str); for (int i = 0; i < len; ++i) printf("%c",str[i]);
for (int i = 0; str[i] != '\0'; ++i) cout<<str[i];;
2. Salida general
cout<<str;
printf("%s",str);

Entonces, al definir una cadena, el espacio abierto debe sermas que elPara ingresar el número de caracteres, la longitud mínima debe ser +1 para el almacenamiento normal.
Pero si la longitud de la matriz definidaMenos que o igual aAl ingresar la longitud, ocurrirá un error.

#include <bits/stdc++.h>

using namespace std;

int main()
{
    
    
    char str[5];
    scanf("%s",str);
    int len=strlen(str);
    cout<<len<<endl;
    for (int i = 0; i < len; ++i)  printf("%c",str[i]);
    cout<<endl;
    for (int i = 0; str[i] != '\0'; ++i)  cout<<str[i];  
    cout<<endl;
    printf("%s",str);

    return 0;
}

len = 4 <5

len = 5 = 5

len = 9> 5

Resumen de SUM

int main()
{
    
     
 char a[] = "abcdefg";
 char *pstr = "abcdefg";
 char b[]={
    
    'a','b','c','d','e','f','g'};
 printf("sizeof(a)=%d,strlen(a)=%d\n",sizeof(a),strlen(a));
 printf("sizeof(pstr)=%d,strlen(pstr)=%d\n",sizeof(pstr),strlen(pstr));
 printf("sizeof(b)=%d,strlen(b)=%d\n",sizeof(b),strlen(b));
}

La estructura de impresión es la siguiente:

tamaño de (a) = 8, strlen (a) = 7
tamaño de (pstr) = 4, strlen (pstr) = 7 tamaño de
(b) = 7, strlen (b) = 19

El resultado muestra:
  Los elementos en char a [] incluyen "abcdefg" y un '\ 0', al igual que pstr, porque todos son una cadena. Entonces, sizeof (a) = 8;
  strlen (a) = strlen (pstr) = 7 es porque strlen calcula todos los caracteres en la cadena excepto el signo final '\ 0';
  y strlen (b) = 19 es porque b No es una "cadena" normal, la cadena debe terminar claramente con '\ 0', y cha b [] es solo una matriz de caracteres, cuando se usa strlen para calcular la longitud de b, b se usa como cadena para calcular la longitud, Es decir, se considera que la "cadena" termina cuando encuentra '\ 0'; y no hay un elemento definido '\ 0' en b, por lo que strlen contará hacia atrás la dirección de memoria al final de b hasta que encuentre \ 0 '. Entonces, con strlen (b), el resultado es impredecible.
  Después de entender el anterior, no es difícil de entender sizeof (b) = 7. b es una matriz de caracteres con solo 7. Nuevamente, no hay '\ 0' en b.
  El último es sizeof (pstr) = 4, que es el tamaño de un puntero, el tamaño del puntero en una máquina de 32 bits = 32 bits = 4 bytes. Entonces el resultado es 4.

Además, la cadena de caracteres se lee del subíndice 1:
cin>>str+1;    scanf("%s",str+1);
cout<<str+1;   printf("%s\n",str+1);

int main()
{
    
    
    char str[20];
    //cin>>str+1;
    scanf("%s",str+1);
    int len=strlen(str);
    cout<<len<<endl;
    for (int i = 0; str[i] != '\0'; ++i)  cout<<str[i];
    cout<<endl;
    for (int i = 1; str[i] != '\0'; ++i)  cout<<str[i];
    cout<<endl;
    printf("%s\n",str+1);
    cout<<str+1;
    return 0;
}

Además, tanto las matrices de caracteres como las cadenas se pueden convertir al tipo de cadena.
string s(str);    string ss; ss=str+1;
Cuando se convierte la cadena con el subíndice 1: cambie la posición de la dirección inicial hasta el final de la matriz.
string s(str+1);   string ss; ss=str+1;
El tipo de cadena también puede concatenar cadenas y matrices de caracteres.

int main()
{
    
    
    char ch[]={
    
    'c','h','i','n','a'};
    char str[20];
    cin>>str;
    string s="c";
    s+="aabb";
    s+=str;
    s+=ch;
    cout<<s;
     return 0;
}

2. Memset de la función de inicialización

Se inicializa por byte, 8 bits por byte. Adecuado para inicializar 0, -1, 0x3f3f3f3f
El complemento de 0 es todo 0; el complemento de 1 es todo 1; cada byte de 0x3f3f3f3f es 0x3f

Suponga que hay una matriz: int a [N];
memset(a,0,sizeof(a));
memset(a,-1,sizeof(a));
memset(a,0x3f,sizeof(a));

En las computadoras modernas, un tipo int tiene aproximadamente 32 bits, que son 4 bytes.
Para los números con signo, el bit más alto representa el bit de signo, por lo que el máximo es 0x7f ff ff ff, que es 2 32 -1, que es aproximadamente 3e9.
Pero generalmente infinity está dispuesto a tomar 0x3f 3f 3f 3f, que probablemente sea más de 1e9, porque es conveniente inicializar.
Después de que se desborde 0x7fffffff, es 0x80000000, que es -2 32.
De manera similar, para números sin signo, el máximo es x0ff ff ff ff. 32 bits son todos unos. Es 0 después del desbordamiento.
largo largo 64 bits.

3. Inicialización de matriz

C / C ++ no admite la asignación general de matrices, se puede inicializar como un todo al declarar la matriz.

  1. Al definir una matriz fuera de la función principal, el valor predeterminado es 0.

  2. Definido en la función principal, no importa cuán grande sea el arreglo, la operación de inicializar todo a 0 es muy simple, como int a [3000] = {0}; puede establecer todos los 3000 elementos de a en 0; si desea asignar otros valores, por ejemplo A todos se les asigna el valor de 7, escrito como int a [3000] = {7}; no funcionará, esto solo asigna el valor de 7 a un [0], y el resto son 0.

4. Entradas múltiples

Deténgase cuando la entrada sea ilegal. En
lenguaje C: use scanf: while(~scanf("%d%d",&n,&m))
use cin en C ++ para escribir directamente:while(cin>>n>>m)

Cuando tanto n como m son 0, deténgase: En
C: En while (~scanf("%d%d",&n,&m),n||m)
C ++:while (cin>>n>>m,n||m)

5. Asignación de estructura

edges[1]={1,2,3};

6. Cadena de estrella de avance

Una matriz simula varias listas vinculadas, que se utiliza para el método de cremallera hash y la lista de adyacencia para guardar imágenes.
int h [N], e [M], ne [M], idx;

h [N] se puede considerar como un nodo principal, y cada vértice está conectado a una lista vinculada para almacenar los vértices conectados a él.
Debido a que es una simulación de matriz, idx puede ser análogo al puntero cuando se almacena la lista vinculada Piense en la matriz completa como un espacio de memoria, e idx es equivalente a un puntero.
e [M] ne [M] se considera como dos elementos en una estructura, y la información del vértice se almacena: e [] almacena el número del siguiente vértice conectado con el borde correspondiente al nodo principal, ne [] Almacena la posición de el siguiente vértice conectado La función de ne puede ser análoga a p-> next. Puede haber varios vértices conectados a los vértices del subíndice del nodo principal, y todos existen en una lista enlazada individualmente.
El nodo principal de h [N] apunta a una posición primero, y la matriz ne [] continúa atravesando hacia abajo hasta que alcanza el final de -1, y la matriz e obtiene el vértice.

struct Edge
{
    
    
	int edge,next;
}edges[M];   

N vértices, M aristas
e es arista, ne es la abreviatura de next

7. Definición de macro

Se deben distinguir #define y typedenf: typedef long long ll;
#define read(x) scanf("%d",&x)
#define read(x,y) scanf("%d%d",&x,&y)
reemplace la entrada scanf, que es más rápida.

#define fir(i,a,b) for(int i=a;i<=b;i++)

8. División binaria

Suponga que hay un número n, divídalo en números binarios de 8 bits:

int n=0xff;
for (int i=7;i>=0;i--) {
    
    
        int t=n&(1<<i);   
        cout<<t<<" ";
}    

Producción:

128 64 32 16 8 4 2 1

int n=0xff;
for (int i=7;i>=0;i--) {
    
    
        int t=n>>i&1;  
        cout<<t<<" ";
}  

Producción:

1 1 1 1 1 1 1 1

Supongo que te gusta

Origin blog.csdn.net/HangHug_L/article/details/113762812
Recomendado
Clasificación