C语言主函数参数|输出缓冲区问题

C程序的两个问题

主函数参数

1、主函数默认至少接受一个参数,就是执行程序的命令本身。传递参数时,按照空格来区分传递的参数。
2、传递的参数的类型,都是字符串,与用户给定的参数类型无关

int main(int argc,char *argv[],char *envp[])

argc:参数个数
argv:字符指针数组,每一个数组元素都是一个字符指针(字符串)传递的参数列表。
envp:环境变量

int main(int argc,char *argv[],char *envp[])
{
	printf("argc:%d\n",argc);
	int i = 0;
	for( ;i < argc;i++)
	{
		printf("%d %s\n",i,argv[i]);
	}
	exit(0);
}

C语言主函数参数|输出缓冲区问题_第1张图片

int main(int argc,char *argv[],char *envp[])
{
    int i = 0;
	while(envp[i] != NULL)
	{
		printf("%s\n",envp[i]);
		i++;
	}
	exit(0);
}

C语言主函数参数|输出缓冲区问题_第2张图片
如果用户需要传递一个整型值,程序处理时需要使用整形方式处理参数

int main(int argc,char *argv[],char *envp[])
{
    printf("argc:%d\n",argc);
	int num = 0;
	sscanf(argv[1],"%d",&num);
	printf("num=%d num*num=%d\n",num,num*num);
	for(int i=0;i < argc;i++)
	{
		printf("%d: %s\n",i,argv[i]);
	}
}

C语言主函数参数|输出缓冲区问题_第3张图片

在linux系统上,一个进程默认打开三个文件:
标准输入stdin 标准输出stdout 标准错误输出stderr


int main()
{
	printf("hello");
	sleep(5);
	printf("world");
	exit(0);
}

并没有打印hello
C语言主函数参数|输出缓冲区问题_第4张图片
在这里插入图片描述
printf函数只是将内容写入到输出缓冲区中,等满足一定条件才会将缓冲区中的内容显示到界面上。
满足以下一个才可以:
遇到"\n"
进程结束时
主动刷新 fflush(stdout);
缓冲区满
扩充:
exit和_exit的区别:1、exit会刷新缓冲区中的内容, _exit不会刷新缓冲区,直接结束进程。
2、exit会执行atexit注册的方法, _exit不会执行。
atexit注册函数:向操作系统注册一个函数,这个函数当前不会被调用,程序结束时,调用exit之后,exit函数退出之前,调用之前注册的函数

void fun()
{
	printf("i am fun\n");
}
int main()
{
	atexit(fun);
	printf("hello\n");
	sleep(3);
	printf("world\n");
	exit(0);
}

C语言主函数参数|输出缓冲区问题_第5张图片

你可能感兴趣的:(c语言,linux,linux,c语言)