2、输入输出控制

1、输入函数

  C语言中输入常用的三个函数:字符输入函数getchar()、字符串输入函数gets()、格式化输入函数scanf()

  1.1、字符输入函数getchar

头文件

stdio.h

函数功能

在键盘上读一个字符

函数原形

int  getchar(void)

函数参数

函数返回值

成功:返回读到的字符

失败或读到结束符:返回EOF(-1)。

  getchar函数的特点:

    getchar函数只能从键盘读到一个字符型的数据,即每次只能接收一个字符。

    getchar有缓冲区和回显。

    它的返回值为int,getchar返回值的含义是存储从键盘上读取的字符,然后返回读取到的字符的ASCII值,因为在计算机中字符是以ASCII值处理的,每个字符都有一个相对应的ASCII值。

/*函数用法*/
#include <stdio,h>

int main()
{
    char a;
    a=getchar();
    printf(“%c\n”,a);
    return 0;
}

   1.2、字符串输入函数gets

头文件

stdio.h

函数功能

从键盘上输入一串以回车作为结束符的字符串放入字符数组中,并自动加‘\0’。

函数原形

char  *gets(char *s)

函数参数

s为字符数组,存储输入的字符串

函数返回值

成功:返回字符数组的起始地址

失败或读到结束符:返回NULL

  gets函数特点:

    回车键不会读入字符串中,字符串必须以‘\0’结束,结束时字符串会自动加‘\0’。

    gets不以空格作为字符串输入结束的标志,而是以回车作为输入结束标志,即点击回车时字符串的输入就结束了,gets函数就执行完毕了,回车即‘\r’,ASCII值为13。

    gets函数的参数中不含长度控制,当输入字符时,最多只能输入n-1个,必须留一位用来存储‘\0’,如果输入的个数超了,则多余的符号也被存储到字符数组中,这样就会造成内存的访问越界,结果是不可预料的。

/*用法*/
#include<stdio.h>

int main()
{
    char  s[10];
    gets(s);
    puts(s);
    return 0;
}

  1.3、格式化输入函数scanf

头文件

stdio.h

函数功能

按指定格式从键盘读入数据,存入地址表示指定存储单元中,并按回车键结束。用户是将数据从键盘输入缓冲区,scanf是从缓冲区来提取数据的。

函数原形

int  scanf(const  char *format,…..)

函数参数

format指定输入格式,后面跟要输入的变量的地址表,为不定参,用“….”代表。

函数返回值

成功:返回输入成功的变量的个数

失败:返回-1(EOF)

   在输入时,每按一次回车键,程序就会认为完成了一次输入操作,scanf就开始从缓冲区读取用户输入的内容,并根据格式控制字符串从中提取有效数据,只要用户输入的数据与格式控制字符串相匹配,就可以正确提取,若输入的内容格式与格式控制字符串不匹配,按回车键就会结束。

  Scanf()函数对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应。

  用户和scanf( )函数是通过缓冲区来中转数据的,用户将数据从键盘输入缓冲区,scanf( )从缓冲区中取数据 

  本质上讲,用户输入的内容都是字符串,scanf()完成的是从字符串提取有效数据的过程。

Scanf(“%d  %d”,&a,&b)---------à11 22
Scanf(“%d,%d”,&a,&b)---------à11,22
Scanf(“%d  is bigger than  %d”,&a,&b)---------à11 is bigger than 22

   输入分隔符:在输入时,一般以空格、TAB或回车键作为分隔符。

    (1)、在用“%c”格式符时,空格和转义字符作为有效字符输入。

    (2)、输入数据时,遇到以下情况认为该数据结束:

                                       ------ 空格、TAB或回车;

                                       ------宽度结束;

                                       ------非法输入(输入的数据格式不对称);

    (3)、scanf函数返回值是成功输入的变量的个数,当遇到非法输入时,返回值会小于实际变量的个数。

    (4)、使用输入函数时可能会留下垃圾

                      当第一次输入时留下的垃圾就会被第二次取走,解决此问题的方法:

      A、 调用getchar函数,清除垃圾字符

/*例子*/
scanf(”%c”,&ch);
getchar();  //清理字符串
scanf(”%c”,&ch);

      B、 用格式串中的空格或“%*c”来吃掉

/*举例*/     
 scanf(”    %c”,&ch);
或scanf(“%*c%c”,&ch);

  scanf函数支持的输入数据的格式:

数据类型

格式符

作用

字符形

c

单一字符

s

字符串

整形

i    d

十进制整数

hd

十进制短整型

ld

十进制长整形

X   x

十六进制无符号整数

o

八进制无符号整数

u

十进制无符号整数

浮点型

e   

指数形浮点小数

f

小数形式浮点小数

   scanff函数支持的格式说明符的修饰符: 

修饰符

功能

h

用于d,o,x前,指定输入为short型整数

l

用于d,o,x前,指定输入为long型整数

用于e,f前,指定输入为double型整数

m

指定输入数据宽度,遇空格或不可转换字符结束

*

抑制符,指定输入项读入后不赋给变量

 2、输出函数

  2.1、字符输出函数putchar

头文件

stdio.h

函数功能

在标准输出上显示一个字符

函数原型

int putchar(int  c)

函数参数

c为字符常量或表达式

函数返回值

输出的字符

  putchar函数的参数和返回值都是整形,它是以字符对应的ASCII码值进行传参和返回的,然后根据ASCII码值以字符形式输出。

  putchar函数输出的是字符型数据,而且每次只能输出一个,若要输出多个字符(即输出字符串)就需要加循环。

/*函数用法*/
#include <stdio.h>
int main()
{
    int  a=65;
    char  b=’B’;
    putchar(a);
    putchar(‘\n’)’
    putchar(b);
    return 0;
} 

  2.2、字符串输出函数puts

头文件

stdio.h

函数功能

在标注输出上显示字符s

函数原形

int  puts(const char *s)

函数参数

s为需要输出的字符串

函数返回值

成功:返回一个非0的数字

失败:返回-1或EOF

  puts在输出字符串时会自动追加换行符’\n’,即会自动换行

/*函数用法*/
#include <stdio.h>
int main()
{
    char  s[]=”welcome”;
    puts(s);  //输出字符串s
    return 0;
}

   2.3、格式化输出函数printf

头文件

stdio.h

函数功能

格式化字符串输出

函数原形

int  printf(const char *format , …)

函数参数

format指定输出格式,后面跟要输出的变量,为不定参,用“….”代表。

函数返回值

成功:返回输出的字节数

失败:返回-1或EOF

 

/*函数用法*/
#include <stdio.h>
Int main()
{
    char ch=’a’;
    char s[]=”hello word”;
    int a=123;
    float f=8512.462265;

    printf(“%3c\n:,ch);
    prinft(“%s,%15s,%10.5s\n”,s,s,s)
    prinft(“%8d,%8.2d\n”,a,a);
    printf(“%-f,%8f,%8.3f,%-+.2f\n”,f,f,f,f);
    return 0;
}

   printf函数支持的输出数据的格式:

数据类型

格式符

作用

字符形

c

单一字符

s

字符串

整形

i    d

十进制整数

hd

十进制短整型

ld

十进制长整形

X   x

十六进制无符号整数

o

八进制无符号整数

u

十进制无符号整数

浮点型

e    E

指数型浮点小数

f

小数形式浮点小数

百分号

%%

百分号本身

   printf支持的格式说明符的修饰符:  

修饰符

功能

m

指定输出数据的长度(包括小数),不够就左补空格,超了就按原样输出

.n

对实数,指定输出数据的小数位数

对字符串,指定实际输出位数

-

是输出数据在域内左对齐(不用该修饰符时右对齐)

+

指定在用符号数的正数前面加正号(+)

0

输出数据时指定左面不使用的空位自动填0

#

使用该符号时可以在八进制和十六进制前面显示0、0x

l

在d、o、x、u前,指定输出精度为long型

在e、f、g前,指定输出精度为double型

3、格式控制符和转义字符

转义字符

意义

ASCII码值(十进制)

\a

响铃(BEL)

007

\b

退格(BS) ,将当前位置移到前一列

008

\f

换页(FF),将当前位置移到下页开头

012

\n

换行(LF) ,将当前位置移到下一行开头

010

\r

回车(CR) ,将当前位置移到本行开头

013

\t

水平制表(HT) 

009

\v

垂直制表(VT)

011

\'

单引号

039

\"

双引号

034

\\

反斜杠

092

\ddd

八进制:以0作为前缀开头,如0677

 

\xhh

十六进制:以0x作为前缀开头,如0x9f

 

 

格式控制符

说明

%c

输出一个单一的字符

%hd、%d、%ld

以十进制、有符号的形式输出 short、int、long 类型的整数

%hu、%u、%lu

以十进制、无符号的形式输出 short、int、long 类型的整数

%ho、%o、%lo

以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数

%#ho、%#o、%#lo

以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数

%hx、%x、%lx
%hX、%X、%lX

以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。

%#hx、%#x、%#lx
%#hX、%#X、%#lX

以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。

%f、%lf

以十进制的形式输出 float、double 类型的小数

%e、%le
%E、%lE

以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。

%g、%lg
%G、%lG

以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。

%s

输出一个字符串

 

             控制符

                                                                         说明

%nd

在%和字母之间插入一个数字来指定输出的最小宽度。如果数字本身的位数小于这个宽度,默认会在左侧用空格填充

%0nd

在字段宽度数字前加一个0,表示用前导零0而不是空格来填充宽度

%.nd

在%和字母之间使用 .<数字> 来指定最小数字位数(精度)。如果数字本身的位数小于这个精度,会在左侧用前导零0填充。

注意:精度修饰符对整数的效果与 %0Xd 非常相似,但逻辑不同。精度指定的是数字部分的最小位数。

%[width].[precision]type

你可以同时使用宽度和精度。宽度是整个输出(包括填充符)的最小字符数,精度是数字部分的最小位数。

%[flags][width][.precision]type

对于浮点数,type 通常是:

f 或 F: 小数形式

e 或 E: 科学计数法形式

g 或 G: 根据数值自动选择 %f 或 %e(更紧凑的形式)

%.nf

在 % 和字母之间使用 .<数字> 来指定小数点后的位数

%m.nf

在 % 和 . 之间插入一个数字来指定输出的最小总宽度(包括小数点、整数部分、小数部分和符号)。


 

posted @ 2020-02-18 15:14  孤情剑客  阅读(502)  评论(0)    收藏  举报