Problema con el búfer de printf
El siguiente contenido puede ser diferente cuando se prueba en Linux y Windows.
1. Introducción
Hay un búfer para la función de salida printf, que se descubrió al usar la prueba de función de suspensión.
Primero, recapitulemos la pregunta de prueba:
simplemente escriba un programa hola mundo
#include <stdio.h>
int main()
{
printf("hello world\n");
sleep(5); //延迟5秒
printf("hello friend\n");
return 0;
}
Resultado de salida: hay un intervalo de 5 segundos entre
la salida de hola mundo y hola amigo
Cuando modificamos el código: elimine el salto de línea \n después de hola mundo
#include <stdio.h>
int main()
{
printf("hello world");
sleep(5); //延迟5秒
printf("hello friend\n");
return 0;
}
Salida:
Esta salida es:El cursor parpadea durante 5 segundos y luego aparece hola mundo hola amigo
Aquí encontraremos que: cuando eliminamos el carácter '\n', la función sleep ya no es un retraso entre sentencias, sino un retraso de todo el programa.
Los resultados aquí son muy sorprendentes. Nunca me había dado cuenta ni había pensado en este problema. Entendamos printf en profundidad.
2. Comprensión profunda de printf
printf es una función de búfer de línea, no envía directamente los datos a la pantalla, sino que primero los coloca en el búfer, y solo después de que se cumplan ciertas condiciones, se mostrará el contenido del búfer.
La configuración del búfer es para mejorar la velocidad de E/S y reducir el desperdicio de recursos de la CPU causado por la espera de la E/S de la CPU.
Las siguientes 5 condiciones pueden actualizar el búfer:
1. El búfer está lleno
2. Hay '\n' y '\r' en los caracteres escritos
3. Llame a fflush para actualizar manualmente el búfer
4. Al llamar a scanf para leer datos del búfer, el búfer también será Datos Actualizar dentro de
5. Al final del programa
1. El búfer está lleno
El tamaño del búfer de la función printf es bytes 1024. Cuando se excede el tamaño del búfer, el búfer se actualizará y se imprimirá el resultado.
El tamaño del buffer es de 1024 bytes, este tamaño se obtiene de esta forma, el código es el siguiente:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 /*argc:命令行输入参数个数,argv:命令行参数
5 *argv为字符指针数组,argv[i]为指向第i个命令行参数内容的指针
6 */
7 int main(int argc, char **argv){
8 int i;
9 char a='a';
10 if(argc != 2) //命令行参数为2,否则出错
11 {
12 printf("Usage:%s Number\n",argv[0]);
13 return 0;
14 }
15
16 for(i=0;i<atoi(argv[1]);i++) //atoi:字符转化为整数
17 {
18 printf("%c",a);
19 }
20
21 while(1); //让程序一直运行
22 }
Resultado de la ejecución:
Descripción : en Linux, el tamaño del búfer de impresión es de 1024 bytes. while(1) mantiene el programa en ejecución, cuando el búfer no está lleno, no se imprimirá ninguna salida.
2. Hay '\n' y '\r' en los caracteres escritos.
Código de prueba:
#include <stdio.h>
int main()
{
printf("hello world\n");//
sleep(5); //延迟5秒
printf("hello friend\n");
return 0;
}
Resultado de ejecución:
3. Llame a fflush para actualizar manualmente el búfer
Código de prueba:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
printf("hello world");
fflush(stdout);
sleep(5);
exit(0);
}
Proceso en ejecución y resultados:
aquí, después de que finalice la declaración printf, use fflush para forzar la actualización del búfer, luego imprima el contenido primero y luego ejecute la declaración de suspensión.
4. Al llamar a scanf para leer datos del búfer, los datos en el búfer también se actualizarán
Esto lo podemos entender ya que cuando ingresamos desde el teclado, los datos en el data se refrescarán automáticamente.
5. Al final del programa
Código de prueba:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
printf("hello world");
sleep(5);
exit(0);
}
resultado de la operación: