1、主函数传参
int main(int argc,char *argv[],char *envp[]);
argc:传递的参数列表中参数的个数
argv:传递的参数列表
envp:传递的环境变量
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[],char *envp[])
{
int i = 0;
for(; i < argc; ++i)
{
printf("%s\n",argv[i]);
}
exit(0);
}
可以看到,传递的参数以空格区分开,那么传整个字符串可以写进“字符串”或者使用“\ ”转义字符。
主函数默认接收一个参数,就是执行的命令。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[],char *envp[])
{
int i = 0;
while(envp[i] != NULL)
{
printf("%s\n",envp[i]);
}
exit(0);
}
2、缓冲区的深入理解
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello");
sleep(5);
printf("world\n");
}
这个代码执行时,并不是打印出“hello”,睡眠5秒钟后,再打印“world”。而是将“hello”写到输出缓冲区中,睡眠5秒钟后,再将“world”写到输出缓冲区中进而显示到界面上。
缓冲区又称为缓存,它是内存空间的一部分,也就是说,在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据,这部分预留的空间就是缓冲区。
为什么引入缓冲区?
比如我们在磁盘读取数据的时候,先把数据放在缓冲区中,计算机再直接从缓冲区读取数据,等缓冲区中数据取完后再去磁盘读取,这样就可以大大减少对于磁盘的读写次数,再加上计算机对缓冲区的操作远远快于对磁盘的操作,所以应用缓冲区可以大大提高计算机的运行速度。
缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
输出缓冲区刷新的条件:
-
程序结束
-
遇到“\n”
-
缓冲区满(默认1024字节)
-
主动刷新 fflush(stdout);
结合缓冲区谈谈C语言getchar()、getche()、getch()的区别
– 缓冲区 头文件 回显
getchar() 有缓冲区 stdio.h 有回显
getch() 无缓冲区 conio.h 无回显
getche() 无缓冲区 conio.h 有回显 -
int getchar(void)
当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。 -
getch()和getche()
getch()的作用是从键盘接收一个字符,且不带回显。就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以在C语言中可以用它来实现“按任意键继续”的效果,即程序中遇到getch();语句,就会停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。
getche()和getch()很相似,它也需要引入头文件conio.h,它们之间的区别就在于:getch()无回显,getche()有回显。 -
exit()和_exit()
_exit()函数的作:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的"清理I/O缓冲"一项。 -
atexit()
按照ISO C规定,一个进程可以登记多至32个函数,这些函数将由exit或者从main函数中返回时自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数。
函数原型
int atexit(void (*function)(void))
返回值:若成功,返回0;若错误返回非0;
其中,atexit的参数是一个函数地址,当调用此函数时无需向他传递任何参数,也不期望它返回一个值。exit调用这些函数的顺序与它们登记时候的顺序相反。同一函数如若登记多次,也会被调用多次。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void fun1()
{
printf("i am fun1\n");
}
void fun2()
{
printf("i am fun2\n");
}
int main()
{
atexit(fun1);
atexit(fun2);
printf("hello\n");
printf("world\n");
exit(0);
}
通过程序示例我们验证得到:不管atexit的位置在哪,我们总是在程序正常结束前调用atexit所登记的函数,并且调用顺序与登记顺序相反,同一函数如若登记多次,也会被调用多次。