C语言格式控制符&格式化IO函数

本文详细介绍了C语言中的格式控制符,包括字符类型、位宽和小数位数设置,以及转义字符和续行符的用法。重点讲解了printf和scanf的原理、注意事项,以及如何处理scanf遇到的问题,如输入验证、缓冲区管理和字符串读取规则。
摘要由CSDN通过智能技术生成

格式控制符

1.常见的格式控制符号

%c :字符型
%d :整型
%hd :短整型
%ld :长整型
%hu :无符号短整型
%f :单精度浮点型
%lf :双精度浮点型
%s :字符串型
%p :指针型
%x :十六进制
%o :八进制
%#x :十六进制会加上前缀0x
%#o :八进制会加上前缀0
%i :可以打印十进制,也可以获取键盘输入的八进制(输入的时候加上0)和十六进制(输入的时候加上0x)
%X :十六进制,遇到字母用大写表示

2.位宽和小数位数设置

%10d :10表示位宽,正的10表示输出的数据靠右边
%-10d :10表示位宽,负的10表示输出的数据靠左边
%10.5f :10表示位宽,小数点后面的5表示保留5位小数
%.5f :小数点后面的5表示保留5位小数
注意:位宽设置规律
位宽大于数据原本的位数–》填充空格来凑齐位宽
位宽小于数据原本的位数–》数据原样输出,不会截取

3.转义字符

\n :回车转义了
\ :打印\,\必须转义,单独的\编译语法错误
\\ :打印两个斜杠
双引号嵌套,里面的双引号必须转义
‘\14’或者’\17’ :是个字符,只能是八进制的数,前面不要写上0
‘\x89’或者’\xa1’ :是个字符,只能是十六进制的数

4.续行符

作用:当你写的一句代码,逻辑上是个整体,但是你有需要切换到多行去写,此时就要使用续行符

格式化IO函数

1.作用

printf:用于在屏幕(标准输出)上输出各种类型的数据
scanf: 用于获取键盘(标准输入)输入的各种类型数据

2.原理和注意的问题

printf和scanf共用一个缓冲区

(1)printf的工作原理

原理:先把数据存放到缓冲区中,遇到回车,return exit() 缓冲满了 scanf和printf切换使用的时候就会刷新缓冲区,在液晶屏(终端)上显示。

注意问题:
      printf("%d\n",a);
      printf("%d  %f  %lf  %s",a,b,c,d);
      exit(0);   //结束程序,刷新缓冲区
      return 0;  //结束程序,刷新缓冲区
      _exit(0)  //结束程序,不刷新缓冲区

简要概括:
在这里插入图片描述
输入以下代码时终端不会打印hello world

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello world"); //没有输出
    _exit(0);    
}
(2)scanf的工作原理

读取单个变量:scanf(“%d”,&a);
读取多个变量:scanf(“%d%f%lf”,&a,&b,&c); //a,b,c跟前面格式符号对应

注意:中间不要加回车,也不要加空格

#include <stdio.h>

int main()
{
    int a;
    float b;
    double c;
    scanf("%d%f%lf",&a,&b,&c);
    printf("a = %d\n",a);
    printf("b = %f\n",b);
    printf("c = %lf\n",c);
    return 0}
/*
    执行结果
        输入:
        2
        34.5
        34.55
        输出:
        a = 2
        b = 34.500000
        c = 34.550000
*/

简要概括:
在这里插入图片描述

(3)解决scanf遇到的问题

1、scanf如何判断用户输入的数据是否符合要求
解决办法:通过scanf的返回值来判断,scanf的返回值表示用户输入的符合要求的数据个数

#include <stdio.h>

int main()
{
    int a,b,c;
    //定义变量保存scanf的返回值
    int ret;
    
    printf("输入三个整数\n");
    ret = scanf("%d%d%d",&a,&b,&c);
    printf("scanf的返回值是%d\n",ret);//scanf的返回值只保存正确输入的值    
}

/*
    执行结果:
    输入三个整数
    1
    2
    sdgdfg
    scanf的返回值是2     
*/

2、输入一个整数,然后输入一个字符
输入完整数以后,回车会被当成字符读取了,导致不能输入新的字符

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()  
{
    int a;
    char b;
    printf("请输入一个整数和一个字符!\n");
    scanf("%d",&a);
    //你刚才输入完整数以后,会敲个回车,回车会被当成字符读取
    scanf("%c",&b);
    
    //打印输入的结果
    printf("您刚才输入的数据是: %d   %c\n",a,b);
    return 0;
}

解决方法:调用C语言的库函数getchar()
int getchar(void); //从缓冲区里面读取一个字符
返回值:你读取到的字符的ASCII码值

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()  
{
    int a;
    char b;
    int ret;
    
    printf("请输入一个整数和一个字符!\n");
    scanf("%d",&a);
    
    //主动清除缓冲区里面残留的\n
    ret=getchar();
    printf("getchar从缓冲区里面读取的字符,ASCII码值是: %d\n",ret);
    
    scanf("%c",&b);
    
    //打印输入的结果
    printf("您刚才输入的数据是: %d   %c\n",a,b);
    return 0;
}

3、scanf(“%d”),输入123hello会把123读取出来
scanf(“%d”),输入12.36会把12读取出来
解决方法:getchar调用判断后面一个字符是不是\n

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int a,ret,n;
    
    printf("输入一个整数\n");
    ret = scanf("%d",&a);
    
    //判断用户输入的内容是否存在整数
    if(ret == 1)
    {
        //进一步判断,排除123hello,23.4这两种情况
        //马上从缓冲区里面读取一个字符来判断
        n = getchar();
        
        if(n !='\n')  
        {
            printf("sorry,输入的不是整数\n");
        }
        else
        {
            printf("输入的是整数\n");
        }
    }
    else
    {
        printf("输入的不是整数\n");
    }
    
    return 0;
}

4、scanf读取字符串,遇到空格会结束读取
空白字符在起始位置遇到不会结束读取,在中间位置遇到就会结束读取
空白字符有:回车、空格、制表符

解决方法:scanf(“%[^\n]”,str); //读取到\n才结束 [^\n]是正则表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值