scanf函数使用方法详解

  • 一.scanf函数是什么?
  • 二.scanf函数的作用
  • 三.注意事项
    • 1.输入数据
    • 2.%c
  • 四.字段宽度
  • 五.scanf函数的返回值

一.scanf函数是什么?

1.首先我们需要知道,scanf函数是一种格式化输入函数(按照格式字符串的格式,从键盘上把数据输入到指定的变量之中)

C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项。

平时我们使用的最多的就是% + 类型。

二.scanf函数的作用

scanf函数是一种格式化输入函数,它的作用便是通过我们的键盘将输入字符转换成我们需要的类型

在这里需要注意,从键盘上输入的都是字符列如我们输入的是数字123,其实是字符‘1’, ‘2’, ‘3’。 为什么呢?

操作系统内核就是这样运作的。操作系统在接收键盘数据时都将它当成字符来接收的。这时就需要用“输入控制符”将它转化一下。%d的含义就是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过 %d 转化完之后,字符 123 就是数字 123 了

int i = 10;scanf("%d", &i);//输入的是字符123,转化为数字123

三.注意事项

1.输入数据

1. 通常,在调用 scanf()函数时,格式化字符串只包含转换说明(类型的转换)
如果不是,那么格式化字符串中除转换说明与空白符以外的其他所有字符,必须与输入源对应位置的字符完全一致。否则 scanf()函数就会终止处理,并将不匹配的字符放回到缓冲区中下一个转换字符将会从该字符开始。

此时,若我们输入的是10,i依旧为零,因为在输入时我们并没有输入 i=10, 而是直接输入10,此时缓冲区里只有10,scanf从缓冲区里读数据时并没有i 于是便终止处理了,因此 i = 0没有被改变

但是此时字符1和字符0依旧在缓冲区中,于是gets函数就将它读走了,然后输出。


此时我们输入 i=10,此时打印i就是10,然后换行了,这是为什么?
因为在我们输入i=10后按了回车,相当于在向缓冲区内输入(\n),之后输入字符串时,被gets函数读走,然后输出了。

此时想要解决很简单,只需要将\n读走就可以了,在这里我们可以使用getchar();

注意:此处此处只是举个栗子,在输入时我们一般都不会包含除转换说明之外的其他字符,否则很容易出现BUG。

2.%c

char s = 0;scanf("%c", &s); //此时输入 空格c 将会输出什么printf("%c\n", s);

最后会输出,空格 然后换行,此时缓冲区内有,c和\n

那要是%d 或者 %f 呢?

此时我们发现除了 %c 之外的类型说明都会都会忽略前面的空白字符(whitespace character)(空格, 回车,tab符等)。

四.字段宽度

字段宽度是十进制整型正数,它指定了对于给定的转换说明,scanf()所读取字符的最大数量。对于字符串输入来说,字段宽度可以防止缓冲区出现溢出情况


此时,缓冲区内还有数字4 和 \n。

五.scanf函数的返回值

1. scanf()函数的返回值是成功存储数据项的数量

如果一切执行顺利,返回值就是转换说明的数量(但不计包含星号的转换说明)。如果发生读取错误或在转换数据项前就到达了输入源尾部,则 scanf()函数会返回值 EOF.