C语言<stdio.h>标准库: scanf 详解

C语言<stdio.h>标准库: scanf 详解,第1张

系列文章目录

C语言标准库: printf 详解
C语言标准库: scanf 详解
持续更新中…


文章目录
  • 系列文章目录
  • 前言
  • 一.scanf的概念
  • 二.格式字符串
    • 1.常用scanf格式码
    • 2.scanf的返回值
      • ①.scanf的返回值是函数成功转换并存储于参数中的值的个数。


      • ②读入数据时遇到了“文件结束”则返回EOF(end of file 为 Ctrl + d 或 Ctrl + z)。


    • 3.字符的输入
      • ①输入字符
      • ②输入字符串
    • 4.数据宽度
      • ①限制接收字符串的数量
      • ②限制接收字符串的条件
      • ③限制接受整型的个数
    • 5.缓冲区(浅谈)
  • 四.实战练习
  • 五.小结


前言

本系列讲述了C语言标准库中的相关函数知识
本系列参考书籍《C和指针》


一.scanf的概念

定义: scanf 是(scan format)的缩写。


scanf是从标准输入流stdin中读入内容的通用字程序。


scanf函数接受数个参数,其中第一个参数是一个格式字符串,用于描述期望的输入类型。


剩余几个参数都是变量,用于存储函数所读取的输入数据。


调用格式: scanf("<格式字符串>",<地址表>);
格式字符串: %[*][数据宽度][格式码]
格式码: [长度][类型格式码]

二.格式字符串 1.常用scanf格式码

补充: 格式码里的 [长度] 就是%f%lf所多出来的l,说白了就是长的float,也就是8个字节的double。


%f表示的就是 [类型格式码] 指的就是浮点型的类型,%d%ld同理。


格式含义变量类型
%d读取一个十进制整型值int
%o读入一个八进制整型值int
%x读入一个十六进制整型值int
%u读入一个十进制的无符号整型unsigned int
%ld读取一个长整型值long
%f读取一个实型值(浮点数)float
%lf读取一个双精度实型值double
%c读取一个字符char
%s从输入中读取一个字符串char 型数组
%[^ ]从输入中读取一个字符串char 型数组

2.scanf的返回值

①.scanf的返回值是函数成功转换并存储于参数中的值的个数。


代码如下:

    double a = 0;
    int b = 0;
    char c = 0;
    printf("请输入数据:>");
    int ret = scanf ("%lf%d%c", &a, &b, &c);
    printf("输出结果:%d", ret);

运行结果:

	请输入数据:>1.0 2c
	输出结果:3

②读入数据时遇到了“文件结束”则返回EOF(end of file 为 Ctrl + d 或 Ctrl + z)。


补充: EOF == -1

代码如下:

    int a = 0;
    printf("请输入数据:>");
    int ret = scanf ("%d", &a);
    printf("输出结果:%d", ret);

运行结果:

	请输入数据:>^D //请用键盘按下Ctrl + d,而非输入^D
	进程已结束,退出代码0 //这里不会返回EOF而是直接停止进程

3.字符的输入

①输入字符

输入格式 : scanf("%c", &str);

我在前面使用%c进行字符输入时与其他类型不同,我在字符 c 的前面没有空格,这也是使用%c进行输入时与众不同的地方,它会接受输入的空格、制表符、换行符等都会被跳过,但%c会去接收。


我们可以通过前面学习的返回值的内容进行验证。


代码如下:

    char a = 0;
    printf("请输入数据:>");
    int ret = scanf ("%c", &a);
    printf("输出结果:%d", ret);

运行结果:

	请输入数据:> //此处为一个空格字符
	输出结果:1

②输入字符串

输入格式 : scanf("%s", str);

在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0}; 这里的str之所以没有加取地址符&原因在于str是一个指针,它所指向的是这一串字符中首字符的地址,对于刚开始接触C语言的同学们现在不需要对为什么str是个指针进行进一步了解,我会在后期更新关于数组与指针的相关内容。


现在你只需要知道当输入一串字符串时,你需要以这样的格式进行书写。


代码如下:

    char str[20] = {0};
    printf("请输入数据:>");
    scanf ("%s", str);
    printf("输出结果:%s", str);

运行结果:

	请输入数据:>abcdef
	输出结果:abcdef

4.数据宽度

①限制接收字符串的数量

输入格式 : scanf("%5s", str);
输入格式 : scanf("%5c", str);

在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0};在这里我们可以通过在格式码的前面加上数字%5c%5s来限制接收字符的数量。


它们都需要预先创建字符类型数组,它们的区别在于%5c可以接收空格、制表符、换行符等字符,但%5s遇到空格、制表符、换行符等字符时会停止,即使没有接收满5个字符。


代码如下:%5s

    char str[20] = {0};
    printf("请输入数据:>");
    scanf ("%5s", str);
    printf("输出结果:%s", str);

运行结果:

	请输入数据:>abc def
	输出结果:abc

代码如下:%5c

    char str[20] = {0};
    printf("请输入数据:>");
    scanf ("%5c", str);
    printf("输出结果:%s", str);

运行结果:

	请输入数据:>abc def
	输出结果:abc d

②限制接收字符串的条件

输入格式 : scanf("%[^\n]", str);

在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0};在这里%[^\n]表示遇到换行符\n时停止接收字符串,当然这里的\n也可以根据自己的需要换成其他的条件。


代码如下:

    char str[20] = {0};
    printf("请输入数据:>");
    scanf("%[^\n]", str);
    printf("输出结果:%s", str);

运行结果:

	请输入数据:>abcdef/*此处换行,也就是在键盘上按下回车键*/
	输出结果:abcdef

③限制接受整型的个数

这里的%2d表示接收缓冲区内前2个整形数字,即使后面依然有数字也不再接收。


代码如下:

    int a = 0;
    printf("请输入数据:>");
    scanf("%2d", &a);
    printf("输出结果:%d", a);

运行结果:

	请输入数据:>123
	输出结果:12

5.缓冲区(浅谈)

缓冲区又名缓存,简单来说就是从键盘输入的数据并不会直接显示在我们的屏幕上,正如前面所说,当遇到特定条件时,它才会将内容输出。


我们输入的内容会先通过输入流stdin从键盘上输入到电脑中,那么必定要有一块空间去存储你所输入的数据,它就是缓冲区,你在键盘上输入的内容都会存入缓冲区,包括换行符\n在某些编译器里也可以理解为回车。


缓冲区的内容会根据程序的需要进行提取,不符合条件的便跳过,最后通过输出流stdout在屏幕上显示出来。


四.实战练习

题目:在键盘上输入:a 123aa45.6 677aag\n

	scanf("%c %c %o %2c %lf %2d %d %x %c", &a, &b, &c, d, &e, &f, &g, &h, &i); //相邻格式码中间没有空格,此处是为了让大家看得更清楚加上了空格

注意:遇到非该类型的值时,默认停止接收,如果遇到空格、制表符、换行符等字符时,下一个格式码会默认跳过。


请不要在对应格式码处输入错误的内容,根据编译器的处理方式的不同,产生的结果也将不确定。


变量格式码存储内容
a%ca
b%c空格
c%o123
d%2caa
e%lf45.6
f%2d67
g%d7
h%xaa
i%cg


五.小结

scanf是C语言中十分重要的函数,它承担了大部分的输入任务,所以对scanf的清楚了解有利于未来在C语言的学习道路上更加顺畅,本篇的内容涉及的一些知识我将在后续的更新中慢慢补充,希望我的博客可以帮助到大家,文章如过出现错误或者不严谨的地方,还望大佬多多指点,我也会再接再厉写出更为优质的博客与大家相互交流。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存