嵌入式学习Day4 C语言 --- 输入输出(getchar、putchar、scanf、printf)

本文详细介绍了C语言中的输入输出操作,包括getchar()和putchar()用于单字符输入输出,以及scanf()和printf()进行格式化输入和输出的使用方法,涉及占位符、辅助控制符和常见格式转换。
摘要由CSDN通过智能技术生成

一、输入输出的概念

输入---->计算机 ---->输出    [用内存来存储输入的数据]


1.c语言并不提供输入输出功能,但存在输入输出函数库,我们可以通过调用这些函数来实现输入输出功能 
  
2.标准的输入输出库 
 #include <stdio.h>   //standard input output (标准输入输出)
 
3.三组函数 

a.单个字符输入输出 
getchar
putchar 

b.格式化的输入输出(可以控制输入输出格式)
printf
scanf

c.字符串的输入输出 (*) 
gets 
puts 

    
二、单个字符输入输出 (getchar、putchar) 

getchar() 

格式:int getchar(void);
功能: 获取一个字符 
参数:    void -- 空类型 //表示没有参数 ,靠键盘赋字符值
返回值:int 型 

   成功 返回读到的字符的 ASCII码值 
   失败 返回EOF (-1)

注意返回值:
1、getchar返回值是int类型,效果接收一个字符
2、返回值是返回值,输出效果是输入效果
   返回值:牵扯到的是接收函数的返回值时要用返回值的类型来接收
   输入效果:键盘上敲出一个字符,getchar获得一个字符
3、函数调用时返回值可以接收,也可以不接收,接不接收返回值不影响函数效果

      3eg:  int  ret = getchar();
               getchar();


 练习:
    hello 
    
    从键盘输入 hello    

putchar()

格式:int putchar(int c);
功能:输出一个字符 
参数:要输出的 字符的 ascii码值(或char型数据,牢记char型和int型的微妙关系) 
 返回值:int 型
    成功 是输出的 字符的ASCII的值(整型值)
    失败 EOF 


//键盘上输入hello,屏幕上显示HELLO
法一:
   int ch1,ch2,ch3,ch4,ch5;
   ch1 = getchar();//可见返回值的类型决定了接收他时所要准备的空间类型
   ch2 = getchar();
   ch3 = getchar();
   ch4 = getchar();
   ch5 = getchar();

   putchar(ch1-32);//可见效果是效果,返回值是返回值
   putchar(ch2-32);//因为这里返回值是效果的话,这里应该打印出正数,而不是字符
   putchar(ch3-32);
   putchar(ch4-32);
   putchar(ch5-32);
   putchar('\n');

//法二:
   putchar(getchar()-32);
   putchar(getchar()-32);
   putchar(getchar()-32);
   putchar(getchar()-32);
   putchar(getchar()-32);
   putchar('\n');

三、格式化的输入输出(scanf、printf) 

printf:

定义:格式化输出函数
格式:printf("格式化控制字符串",输出列表);  //eg:printf("b= %d\n",10);

格式控制字符串包括:普通字符、占位符、辅助控制符

普通字符: 
       原样输出 
占位符:
       1、占了一个位置,最终输出效果,将输出列表中对应的参数,以占位符指定的格式输出
       2、占位符要与输出列表相匹配,从左到右逐个对应 
       3、如果占位符个数大于输出列表参数个数,多的输出是随机值 
占位符:
  //整型 
  %d  以 有符号 十进制 格式 输出 
  %u  以 无符号 十进制 格式 输出
  %x  以 十六进制 格式 输出
  %X  以 十六进制 格式 输出 ,但是对应的a b c d e f 都是大写
  %o  以 八进制 格式 输出
  //浮点数 
  %f  以小数的形式输出,默认保留6位小数

-----------------%x-----------------------

	int a = 123;
	printf("%x", a); // 7b(十六进制)

-----------------%X-----------------------

	int a = 123;
	printf("%X", a); // 7B

-----------------%o-----------------------

	int a = 123;
	printf("%o", a); // 173(八进制)

------------------%f-------------------------

     %f:不指定字段宽度,由系统自动指定,使整数部分全部输出,并输出6位小数
应当注意:在输出的数字中并非全部数字都是有效数字。显然只有前7位数字是有效数字。千万不要以为凡是计算 
         机输出的数字都是准确的。双精度数也可用%f格式输出,它的有效位数一般为16位,给出小数6位。

eg:
    float b =  123.45678;
    printf("%f", b); // 打印结果 123.456779

  %g  以 更简洁 的方式输出 ,同时不会输出多余的0 
  %e  以 科学计数法形式 输出
  %E  输出结果中 e 大写 

------------------%e----------------------

    float b =  1.2345678;
	printf("%e", b);//1.234568e+00

	float b = 123.45678;
	printf("%e", b);//1.234568e+02

------------------%E-----------------------

	float b = 123.45678;
	printf("%E", b);//1.234568E+02


  //字符    
  %c  以 字符的 格式 输出   //将对应的ASCII码值的字符形式输出 
  %s  以 字符串 格式 输出

  辅助控制符:
使用格式:%[辅助控制符]d
辅助控制符的种类:
  # 
     %#x //表示 输出十六进制 的前缀 
     %#o //表示 输出八进制 的前缀

	int a = 123;
	printf("%#x", a);  //0x7b


	int a = 123;
	printf("%#X", a);  //0X7B


	int a = 123;
	printf("%#o", a);  //0173(0是八进制的标志)

  m  
     m代表数字 --- 意思是控制输出的宽度 
     实际的参数的宽度 > m  则以实际参数的宽度为准 
                                  < m  默认右对齐 ,前面的空位补空格,m前加0可使空位显示0 
                                          左对齐 m前加一个负号

	int a = 123:
	printf("%5d", a); //  123(右对齐,前边有两个空格) 

	int a = 123;
	printf("%-5d", a); //123  (左对齐,后边有两个空格)

	int a = 123;
	printf("%05d", a); //00123(右对齐,前边有两个空格处补零)

  .n                                                                                                                                                          n代表数字 --- 浮点型的话意思是控制输出的小数位数 (四舍五入)
                     --- 字符串的话意思是输出字符串前n位 

float f = 3.1467;
printf("%.2f",f); //3.15

printf("%.2s", "abcde"); //ab

   l // long 类型 
   ll //long long 类型
   
   h  //half --一半  2个字节 
   hh //1个字节 

printf("%ld",a);
printf("lld",b);


int a = 0x11223344;
printf("%hx\n", a); //3344
printf("%hhx", a);  //44


int a = 0x11223344;
printf("%#hx\n", a); //0x3344
printf("%#hhx", a);  //0x44

练习:
    设a,b为int型变量,
    x,y为float型变量,
    c1,c2为char型变量,
    且设a=5,b=10,x=3.5,y=10.8,c1=’A’,c2=’B’。
    为了得到以下的输出格式和结果,请写出对应的printf语句。
   
    (1)a = 5, b = 10, x + y = 14.3
    (2)x - y = -7.3, a - b = -5
    (3)c1 = ’A’ or 65(ASCII) c2 = ’B’ or 66(ASCII)

int a = 5;
int b = 10;
char c1 = 'A';
char c2 = 'B';
float x = 3.5;
float y = 10.8;

printf("a = %d,b = %d,x+y = %.1f\n",a,b,x+y);
printf("x-y = %.1f,a-b = %d\n",x-y,a-b);
法一:
printf("c1 = %c%c%cor%d(ASCII) c2=%c%c%cor%d(ASCII)\n",'\'',c1,'\'',c1,'\'',c2,'\'',c2);
法二:
printf("c1 = \'%c\'or%d(ASCII) c2 = \'%c\'or%d(ASCII)\n",c1,c1,c2,c2); 

scanf 

定义:格式化输入函数
格式:scanf("格式控制字符串",地址列表)
返回值(int型):
    (1)返回正整数。表示正确输入参数的个数。
    (2)返回整数0。表示用户的输入不匹配,无法正确输入任何值。
    (3)返回-1。表示输入流已经结束。


格式控制字符串:普通字符、占位符、辅助控制符


普通字符: 原样输入  //不建议写占位符:
占位符定义:
       占了一个位置,将输入的数据,转换为占位符指定的格式,放到地址列表对应的一块内存空间上,占位符也决定了能识别的字符的范围 

占位符:
  //整型 
  %d  将输入的数据 转换为 有符号 十进制 格式 
  %u  将输入的数据 转换为 无符号 十进制 格式 
  %x  将输入的数据 转换为  十六进制 格式
  %o  将输入的数据 转换为  八进制 格式 
  //浮点数 
  %f  将输入的数据 转换为 小数的形式
  %g  
  %e  
  %E  
  //字符    
  %c  以 字符的 格式 输入  //将对应的ASCII码值的字符形式输出 
  %s  以 字符串 格式 输入 

 注意:
    1.第二个参数注意一定要写 & (取地址)
      Segmentation fault (core dumped) //程序试图访问不能被访问的空间 
    2.多个除字符型数据输入时以空白符作为分割符,也可不用分割符
      空白符有:空格、回车、Tab 

eg: 以空格作为分割符    

     键盘上输入:123 456 789
       scanf获取: scanf("%d%d%d",&a,&b,&c);

eg:不用分隔符(?),通过键盘给a、b、c分别赋予123、456、789

     键盘上输入:123 456 789                                                                                                                   scanf获取: scanf("%d %d %d",&a,&b,&c);  //这里使用了普通字符原样输入的方式进行赋值


    3.浮点型数据输入时 
      double -- %lf 
      
      类型要匹配 
      int - %d
      long - %ld
      long long - %lld
    4.辅助控制符 
      m  宽度 -- 输入的宽度 
      
      达到宽度时,输入匹配结束 
      只能获取到前m个数据 

int a;
scanf("%3d",&a);

//此时键盘上输入123456
//由于%3d,所以scanf只能获取123

    5.scanf匹配结束的条件 
  

     a.空白符(读完后不取然后跳过再读取其他的)( 一个空白符 --  匹配任意多个空白符) 
    1、 123 456 789
        scanf("%d%d%d",&a,&b,&c);  ( 一个空白符 --  匹配任意多个空白符)
    2、 123 456           789
        scanf("%d%d%d",&a,&b,&c);  //结果和上边的一样


     b.指定宽度
     123456(后边的字符留在输入缓冲区中)
     scanf("%3d",&a); //123
     
     c.非法字符(可读字符读取完遇到非法字符不再读取,非法字符及以后的字符留在输入缓冲区中)
     123a45     
     scanf("%d",&a);  //123
                      //因为是%d,所以a是非法字符

    6. %c 字符占位符(从键盘上给 scanf()输入字符时容易出错,主要是空白符的问题)
            几乎可以识别键盘输入的任何字符 
      
      scanf("%c %c %c",&c1,&c2,&c3); // 一个空白符 --匹配任意多个空白符 
     

清除空白符的问题可用:
          法一:%*c // 表示跳过一个 数据项,来跳过一个空白符

                   (数据项的解释:%d情形下键盘上输入123 456 789中123代表一个数据项

                                                %c情形下键盘上输入abcd中a代表一个数据项)

          法二:用getchar()来拿掉 一个空白符

练习: 
   编写程序从终端输入数据给到变量,
  并打印变量的值
   a = 3 b = 5 x = 8.5 
   y = 71.82 c1= 'A' c2 = 'a'

//scanf获取字符时要注意

int a,b;
float x,y;
char c1,c2;

法一:避免在键盘上敲除空格,使scanf获取空格字符
scanf("%d%d%f%f%c%c",&a,&b,&x,&y,&c1,&c2);     //键盘上输入3 5 8.5 71.82Aa   
                                               //%c获取字符,不是获取字符串

法二:使用普通字符空格,来避免使用分割符空格时,使scanf获取空格字符

scanf("%d%d%f%f %c %c",&a,&b,&x,&y,&c1,&c2);   //键盘上输入3 5 8.5 71.82 A a                                                                                                                        
printf("a = %d b = %d x = %g\n",a,b,x);
printf("y = %g c1 = \'%c\' c2 = \'%c\'",y,c1,c2);

     

    

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值