变量的输入输出
3.14.1 p rintf输出一个数据
一般地,在console程序中,我们可以通过printf函数来输出一个数据的值。它是一个变参函数,它的定义原型如下:
int printf( const char *format, ... );
第一个参数是用来指定要输出的参数对应的数据类型,从第二个参数开始,就是要输出的数据了。
比如要输出一个整数和一个字符数据:
int a = 100;
char c=’a’;
char *str=”hello world”;
printf(“a=%d,c=%c,str=%s\n”,a,c,str);
在上面的例子里面,%d对应着要输出的整数a的类型,而%c对应着字符变量c的数据类型,%s对应着字符串str的类型。更多的数据类型如下:
3.14.2 scanf输入一个数据
我们可以使用scanf从键盘输入一个数据,而scanf_s(windows平台提供,LINUX无)是对输入函数scanf的一个升级版本,可以防止缓冲区溢出等不安全操作。所以,在程序里建议使用安全操作函数scanf_s。scanf函数的定义和printf的定义类似,也是一个变参函数,第一个参数指定待输入的数据类型:
int scanf( const char *format, ... );
比如,下面的例子,分别示例了如何输入各种数据:
char c ;
short s ;
int i ;
char buf[100];
float f;
double d;
scanf(“%c %hd %d %s %f %lf”,&c,&s,&i,buf,&f,&d);
值得注意的是,在用scanf输入数据的时候,必须传变量的地址,所以必须加上&来获取各个变量的地址,但在输入buf字符串的时候,因为buf作为数组的名称,本来就是一个地址了,所以不用加&运算符了。
在程序运行的时候,不同的输入数据之间用空格隔开。注意,scanf无法通过%s输入带有空格的字符串,如果想输入带空格的字符串,需要:
char buf[100];
scanf("%[^\n]", buf);
我们已经知道scanf有数据溢出的风险,比如当我们输入的字符串的长度超过100个字符,那么str[100]就无法容纳从而会溢出,而scanf是不会做溢出检测的。所以,需要使用scanf_s来替换上面的函数,每当将数据输入一个buffer的时候,需要同时提供buffer的长度。
char c ;
short s ;
int i ;
char buf[100];
float f;
double d;
scanf_s(“%c %hd %d %s %f %lf”,&c,1, &s,&i,buf,100,&f,&d);
在上面的输入中,在字符变量c后面指定了长度1,在buf后面指定了buf的长度100。这样,当往buf中输入的数据超过了100个字符的时候,scanf_s就能检测到,并拒绝程序继续输入。其它数据类型,不需要指定数据缓存的长度。
数组元素的输入:
int a[10];
for(int i = 0;i<10;i++)
{
scanf_s("%d",&a[i]);//注意这里a[i]是数组的第i个元素,所以需要使用&求出它的地址。
}
char buf[80];
scanf_s("%s",buf,80);//这里,输入字符串的时候,数组buf本身就是一个地址,所以,不需要加&符号。
注意,scanf先输入整数等数据,再输入字符的时候,要考虑把第一次留在buffer中的回车符flush掉,才能正确输入接下来的字符,比如:
int a;
char c;
scanf_s(“%d”,&a);
fflush(stdin);//这步不能缺少,否则会将在输入整数的时候的换行字符直接赋值给字符变量c。
scanf_s(“%c”,&c,1);
此外,还可以使用getchar/getch来从键盘输入一个字符而putchar则可以输出一个字符到屏幕上,其中getchar函数需要按下回车键,会将输入的字符显示在屏幕上,而getch不需要按下回车键,也不会显示在屏幕上,因此经常用来暂停程序等。
可以使用puts/gets函数来输出或者输入一个字符串。
char ch;
char name[200];
printf("Please input ch\n");
ch = getchar();
putchar(ch);
putchar('\n');
printf("Please input ch\n");
ch=getch();
putchar(ch);
putchar('\n');
printf("Please input name\n");
gets(name);//gets_s(name,200);
puts(name);
每个进程拥有独立的内存空间,也拥有独立的 fd 号码,程序在启动时都会打开三个流,stdin, stdout, stderr,一个用于输入,一个用于输出,一个用于打印诊断或错误消息。典型的,他们被连接到用户的终端(键盘,屏幕等)。与流stdin, stdout, 和 stderr关联的整数形式的文件描述符fd分别是 0,1 还有2。
每个进程生来就有这三个文件描述符绑定在它们身上。