C语言中限定输入scanf的为整型(整数),浮点型

简介: C语言中限定输入scanf的为整型(整数),浮点型

scanf输入的一次小优化

scanf的功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

scanf在接收到规定格式之外的字符时会引发一系列错误(如我写扫雷的时候)

如图:

这是一个常见的错误,那我们是否有办法能够绕过这个错误,给用户再输入一次呢?

如果我们只用scanf就无法解决用户输入其他字符的问题,为此我写了一个函数去解决此类问题.

代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Judge(int n)
{
  while (scanf("%d", &n) == 0 || getchar() != '\n')
  {
    printf("输入的字符不为整型,请重新输入:");
    while (getchar() != '\n');  // 清除缓存区
  }
  return n;
}
int main()
{
  int t = 0;
  t = Judge(t);
  printf("%d", t);
}

这里我运用了一个函数去实现.

输出结果:

这个结果就代表着我们成功限定了用户输入的数据类型

下面是我这个小萌新对scanf的理解和调整的想法

(借鉴了一下其他作者的内容,如有侵权请告知我!)

scanf的运作原理:

当要求的类型与输入的类型不符合时,scanf会选择直接跳过不接收该输入,不接收,也就是说缓存区中输入的东西既没被接收也没有被清除,就这么留在那里.但是用户下一次输入时,scanf缓存区有东西,系统就直接去读取了.

这虽然很不合理,但我们仍要想办法解决这个问题.

对 while (scanf("%lf", &n) == 0 || getchar() != '\n')的解释

若为 0 则说明第一个位置出现了字符

不为 0 则说明前面是整型,此时再取出一个字符

若为 \n 则说明缓存区清空,要是还有问题则又是非法字符

对 while (getchar() != '\n')的解释

清空缓存区,向缓存区读取数据,直到把所有数据读完,再跳出,防止无限循环

对 函数int Judge(int n)的解释

我们需要的是用户输入的为整型,故设置其返回值的类型为整型,Judge只是一个自定义的函数名,定义成其他的也可以

对 t = Judge(t)的解释

我们需要接收Judge的返回值,此时选择了用整型的变量t去接受返回值

接下来是对上面代码的扩展,如果我们可以限定用户输入为整型,是否也能调整为其他类型呢?

调整为浮点型

(头文件我就忽略了哈!!!)

double Judge(double n)
{
  while (scanf("%lf", &n) == 0 || getchar() != '\n')
  {
    printf("输入的字符不为浮点型,请重新输入:");
    while (getchar() != '\n');  // 清除缓存区
  }
  return n;
}
int main()
{
  double t = 0;
  t = Judge(t);
  printf("%.2f", t);
}

输出结果如下:

当然调整成浮点型也是能接收整型的!!!(C语言自带的隐式转换功能)

就先到这里吧!!!

相关文章
|
1月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
1月前
|
C语言
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
170 0
|
2月前
|
C语言
【C语言基础考研向】05 scanf读取标准输入超详解
本文详细解析了C语言中`scanf`函数的工作原理及常见问题。首先介绍了`scanf`如何处理标准输入,并通过示例说明了为何有时会出现阻塞现象及其解决办法。接着探讨了当输入包含多种数据类型时,特别是字符型数据的处理方式,强调了格式控制的重要性,并给出了正确的输入格式示例。通过正确配置,可以避免因空格和换行符导致的问题,确保数据准确读取。
74 10
|
2月前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
2月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
162 2
|
3月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
75 1
|
3月前
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数
|
5月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法