C语言笔记之scanf函数

直接摘抄《C Primer Plus》算求,太经典了,我再偷把懒,就当复习了~

一、概述

从键盘输入的是文本,因为那些键生成文本字符: 字母、数字和标点。比如说,当您想输入整数2004时,您键入字符2、 0、 0和 4 ,如果想把它们存储成4个数值而非字符串,那么您的程序必须把这个字符串逐个字符地转换成数值,这就是scanf()所做的工作!它把输入的字符串转换成各种形式:整数、浮点数、字符和 C的字符串。它是 printf()的逆操作,后者把整数、浮点数、字符和 C的字符串转换成要在屏幕上显示的文本。

跟 printf ( )一样, scanf ( )使用控制字符串和参数列表。控制字符串指出输入将被转换成的格式。主要的区别是在参数列表中。printf()函数使用变量名、常量和表达式,而 scanf()函数使用指向变量的指针。幸运的是,要使用该函数,不必对指针有任何了解,只需要记住下面这些简单规则:

·如果使用 scanf()来读取前面讨论过的某种基本变量类型的值,请在变量名之前加上一个&。

·如果使用 scanf()把一个字符串读进一个字符数组中,请不要使用&。

scanf()函数使用空格(换行、制表符和空格)来决定怎样把输入分成几个字段。它依次把转换说明符与字段相匹配,并跳过它们之间的空格。要在每个输入项目之间至少键入一个换行符、空格或者制表符。惟一的例外就是%c说明,即使下一个字符是空白字符,也会读取那个字符,所以使用%c时要格外小心,我曾经犯过这样的错,调试了好久也没弄明白错在哪里。

scanf()函数所用的转换说明字符与printf()所用的几乎完全相同。主要的区别在于printf()把%f、%e、%E、%g和%0同时用于float类型和double类型,而scanf()只把它们用于float类型,而用于double类型时要求使用l修饰符。

二、机理

我们更仔细地研究 scanf()怎样读取输入。

假定使用了一个%d说明符来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。因为它试图读取一个整数,所以scanf()期望发现一个数字字符或者一个符号(+或者-)。如果它发现了一个数字或一个符号,那么它就保存之并读取下一个字符;如果接下来的字符是一个数字,它保存这个数字,并读取下一个字符。就这样,scanf()持续读取和保存字符直到它遇到一个非数字的字符。如果遇到了一个非数字的字符,它就得出结论:己读到了整数的尾部。scanf()把这个非数字字符放回输入。这就意味着当程序下一次开始读取输入时,它将从前面被放弃的那个非数字字符开始。最后, scanf()计算它读取到的数字的相应数值,并将该值放到指定的变量中。

如果您使用了字段宽度,那么scanf()在字段结尾或者在第一个空白字符处(二者中最先到达的一个)终止。

如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这时 scanf()会停在那里,并把A(或者不管是什么)放回输入。没把任何值赋给指定的变量,程序下一次读取输入时,它就在A处重新开始。如果程序中只有%d说明符 ,scanf()永远也不会越过那个 A (去读下一个)。而且,如果使用带有多个说明符的scanf()语旬. ANSIC 要求函数在第一个出错的地方停止读取输入 。

使用其他数字说明符读取输入与使用%d的情况相同。主要的区别在于scanf()也许会把更多的字符看作数字的一部分。例如,%x说明符要求scanf()识别十六进制数字a到f和A到F。浮点说明符要求scanf()识别小数点、指数记数法 ( e-notation )、新的p记数法( p-notation)。

如果使用%s说明符,那么空白字符以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符。这就意味着使scanf()读取一个单词,也就是说,一个不包含空白字符的字符串。如果使用字段宽度, scanf()在字段的结尾或者第一个空白字符处停止。不能通过字段宽度使得scanf()用一个%s说明符读取多于一个字的输入。最后一点: 当scanf()把字符串放在一个指定的数组中时,它添加终止的’\0’使得数组内容成为一个C字符串。

如果使用 %c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符赋给指定的变量:不会跳过空白字符。

三、格式字符串中的常规字符

scanf()函数允许您把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入字符串准确匹配。

  1. 例如,如果无意间把逗号放在两个说明符之间:

    scanf(“%d,%d”, &m,%n),

    scanf()函数将其解释成,您将键入一个数字,键入一个逗号,然后再键入一个数字。也就是说,您必须像下面这样输入两个整数

    88,121

    因为在格式字符串中逗号紧跟在%d后面,所以您必须紧跟88输入一个逗号。不过,因为scanf()会跳过整数前面的空白字符,所以在输入时可以在逗号后面键入一个空格或换行符。也就是说,下面的两种输入方式也可以接受:

    88, 121

    或者

    88,

    121

  2. 格式字符串中的空格意味着跳过下个输入项之前的任何空格。例如下面的语句:

    scanf(“%d, %d”, &n,&m) ,

    将会接受下列任何一个输入行:

    88,121

    88, 121

    88, 121

    请注意,”任何空格”的概念包括没有空格的特殊情况。

    除了%c以外的说明符会自动跳过输入项之前的空格,所以scanf(“%d%d”,&n,&m) 与scanf(“%d %d”,&n,&m) 的行为是相同的。

  3. 对%c来说,向格式字符串中添加一个空格将导致一些区别。例如,如果在格式字符串中%c之前有一个空格,那么scanf()会跳到第一个非空白字符处。也就是说,命令scanf(“%c”, &ch)读取在输入中遇到的第一个字符,而scanf(” %c”,&ch)则读取遇到的第一个非空白字符。

四、scanf()函数的返回值

scanf()函数返回成功读入的项目的个数。如果它没有读取任何项目(当它期望一个数字而您却键入一个非数字字符串就会发生这种情况),scanf()会返回值0。当它检测到”文件结尾”时,返问EOF(EOF是在文件stdio.h定义的特殊值。一般#define指令把EOF的值定义为-1)。

时间: 2024-10-16 04:01:41

C语言笔记之scanf函数的相关文章

C语言中关于scanf函数的用法

scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式. 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成

黑马程序员&mdash;&mdash;【黑马视频笔记】C语言基础之scanf函数的使用

  0.自己实际遇到的坑 Mac下如果用标准键盘,使用scanf输入时不能用小键盘上的回车,否则系统不能很好的识别. 1.scanf函数的基本使用 1: // 定义一个变量,用来保存用户输入的整数 2: int number; 3: 4: // scanf函数只接受变量的地址 5: // scanf函数是一个阻塞式的函数,等待用户输入 6: // 用户输入完毕后,就会将用户输入的值赋值给number变量 7: // 函数调用完毕 8: scanf("%d", &number);

黑马程序员--C语言基础之--scanf函数

------- IOS培训期待与您交流! ---------- 写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一.C语言本身并不提供输入输出的语句,输入输出操作是由C标准函数库中的函数来实现的.今天就先说说输入:scanf函数. scanf函数与printf函数一样,都不是C语言的关键字,而只是函数库的名字,它们被定义在stdio.h里,因此在使用scanf函数时要加 上#include<stdio.h>.它是格式输入函数,即按用户指定的格式从键

C语言 05-printf和scanf函数

本文目录 一.printf函数 二.scanf函数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据. 1.用法 1> printf(字符串) printf("Hello, World!")

C语言编程之--scanf()函数与getchar()函数搭配来理解C程序的输入缓存(buffer)

博主最近在学习C语言编程,在书中的代码示例中出现了下面的代码段: #include<stdio.h> int main() { char a[5]; int i; printf("请依次输入值:\n"); for(i=0;i<5;i++) { scanf("%c",&a[i]); getchar(); //为什么要加一个getchar()? } printf("\n"); for(i=0;i<5;i++) { pr

C语言gets雨scanf函数的用法

/*1.不同点: scanf不能接受空格.制表符Tab.回车等: 而gets能够接受空格.制表符Tab和回车等: 2.相同点: 字符串接受结束后自动加'\0'. 使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止*/ #include "stdio.h" #include "string.h" in

C语言笔记之printf()函数

先看例子: printf("This line has only controlling strings.\n"); `printf("I am %d years old and %f inch tall", 21, 132); 参数 printf()的参数分为两大部分,分别是控制字符串和参数列表,二者用逗号隔开,而且参数之间也要用逗号隔开.其中控制字符串是字符串常量,如果不需要其他参数的话,双引号里面的文字将被原原本本的打印到屏幕.通俗的讲,双引号里面是什么,输出

【好程序员笔记分享】C语言之scanf函数的基本使用

ios培训------我的c语言笔记,期待与您交流! #include <stdio.h> int main() { // 定义一个变量,用来保存用户输入的整数 int number; // scanf函数只接受变量的地址 // scanf函数是一个阻塞式的函数,等待用户输入 // 用户输入完毕后,就会将用户输入的值赋值给number变量 // 函数调用完毕 scanf("%d", &number); printf("用户输入的值是%d\n",

【好程序员笔记分享】C语言之scanf函数的其他用法和注意

ios培训------我的c语言笔记,期待与您交流! #include <stdio.h> int main() { /* 1.输入字符 char myc; scanf("%c", &myc); printf("输入的字符是%c\n", myc); */ /* 2.一次性输入多个数值,并且以某些符号隔开 int num1, num2; scanf("%d#%d", &num1, &num2); printf(&