gets、scanf和getchar之间的区别
1、get函数读取数据时,接受的数据包括数据和回车符。即:读取数据后输入流没有输入
操作动作。
2、scanf函数读取数据时,接受的数据只有数据,不包括回车符。即:读取数据后输入流
还存在回车符操作动作。
3、getchar函数读取一个字符数据时,接受的数据只有一个字符,不包括回车符。即:
读取一个字符数据后就默认输入数据结束。读取数据后输入流还存在回车符操作动作。
scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例),所以scanf()函数应当是C学习者能熟练运用的一个函数,但有很多初学者对此函数不能很好的运用,在实际编程中错误使用scanf()函数,导至程序产生某种错误不能正常运行,以至产生“scanf()函数有BUG”,“scanf()函数无用论”等等错误观点。 本文结合笔者在编程实践中及论坛上网友所遇到的问题作一释疑,但笔者水平有限(菜鸟级),难免有谬误之处,还望达人指点一二。(Email:knocker.k@https://www.doczj.com/doc/8b14842679.html,) 本文分上,下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数过程中出现的常见错误及对策。当然,文中某些解决方法,均可以采用其他函数和方法来更好地解决,但本文仅限讨论scanf()函数本身。 上篇,详细介绍了scanf()函数控制串的构成。下篇,用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧。 二、scanf()函数的控制串 函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。空白符; 3。非空白符; (A)格式化说明符
C语言格式输入函数scanf()详解标题 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 一、scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。 例如:&a, &b 分别表示变量a和变量b 的地址。 这个地址就是编译系统在内存中给a,b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它 语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下: 在赋值表达式中给变量赋值,如: a=567 则,a为变量名,567是变量的值,&a是变量a的地址。 但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址, 如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。 【例4.7】 main(){ inta,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); } 在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7 8 9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如: 7 8 9
对于C语言中的scanf函数的小结 对于scanf函数的作用大家应该都知道吧。在任何一本C语言的教材中都有过介绍,它的一般形式是(格式控制,地址表列) 我今天想说说使用这个scanf函数的时候,应该注意哪些问题吧。 1.scanf函数中的格式控制应该是变量名的地址,而不是变量名,例如a和b为整形变量,如果写成scanf(“%d%d”,a,b); 就会出错的,应该将这个,a,b改成&a,&b;(表示地址) 2我们都知道C语言中的字符串是存放到字符数组中的,如果我们定义了一个字符数组,如char a[20];我们想把字符串输入到这个字符数组中通常有两种方式,第一种.逐个字符输入,采用for循环的形式。第二种,直接输入字符串的形式,用格式控制符%s.第一种我们这样输入, for(i=0;i<=19;i++) { Scanf(“%c”,&a[i]); } 第二种我们用这种方式输入 Scanf(“%s”,a); 注意第二种这种形式,我们没有加&,这是为什么呢,这是
因为,C语言中把这个数组名当做该数组的起始地址。但是这种数组仅限于字符数组,不要企图,利用数值型数组的名。来整体输入,一个数值型的数组,这就是大错误了,比如这样写是不正确的 Int a[10]; Scanf(“%d”,a); 数值型数组的输入只能采用上面的第一种方法。 3对于指针问题,大家需要注意一点, 指针就是地址,这是在任何条件下都成立的,(请允许我极端一点),比方看下面的例子。 Char *p; Char a[20]; P=a; For(i=0;i<20;i++,p++) { Scanf(“%c”,p); } 这是一个采用指针变量输入数据的例子,这里的指针变量p 在for循环之前就指向了这个数组a,也就是指向了数组的首元素,也就是是说指针变量p里存放的是,数组首元素的地址,所以在用这个scanf函数进行输出时,指针变量的前方就不用再加取地址符号了。
------------------------------------------------------------------- | 问题描述一:(分析scanf()和getchar()读取字符)| ------------------------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include
ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; } 程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后按下回车准备输入第二个字符时,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a'回车, 打印结果是97,10(回车)。输入字符'a'-空格-‘b’,结果为97 32也就是说ch2接收的是空格而不是’b’。这是为什么呢? 【分析】: 首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时(按下回车键)会将输入的数据全部存入输入缓冲区(包括空格和回车),而输入函数直接从输入缓冲区中取数据。正因为输入函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,输入函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! 其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样
自己来写printf()和scanf()函数 一、预备知识——C语言中的可变参数函数 1.先举一个例子: #define bufsize 80 char buffer[bufsize]; /**************************************************************** * 这个函数用来格式化带参数的字符串 *****************************************************************/ int vspf(char *fmt, ...) { va_list argptr; //声明一个转换参数的变量 int cnt; va_start(argptr, fmt); //初始化变量 //将带参数的字符串按照参数列表格式化到buffer中 cnt = vsnprintf(buffer,bufsize ,fmt, argptr); va_end(argptr); //结束变量列表,和va_start成对使用 return(cnt); } /**************************************************************** * 主函数 *****************************************************************/ int main(int argc, char* argv[]) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); return 0; } 下面我们来探讨如何写一个简单的可变参数的C函数. 2.写可变参数的C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr );
C语言scanf函数应用问题解答 C语言的输入是由系统提供的库函数完成的。scanf函数是C语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果。以下结果都是基于VC++6.0运行环境。 一、格式说明符和输入项的三对应(类型、个数、顺序)scanf 函数格式中的格式说明(“%格式字符”)应与输入项数据类型一致,个数相等、顺序对应(除格式说明中出现“*”附加格式说明字符外)。示例一:inta,b;scanf(%d%d%d,a,b);printf(%d,%d,a,b);输入“345”时,输出“3,4”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出。再如inta,b;scanf(%d,a,b);printf(%d,%d,a,b);输入“34”时,输出“3,-858993460”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不一致造成的。再如structst{intnum;charname[10];intage;floatscore;}student;scanf(%d, %s,%d,%f,student);输入“10001,zhang,23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。 应该写成:scanf(%d,%s,%d,%f,student.num,https://www.doczj.com/doc/8b14842679.html,,student.age,stu-dent. score);保证格式说明与输入项个数相等、一一对应,才能使student正确接收输入数据。示例二:chara,b;scanf(%d%d,a,b);printf(%d,%d,a,b);输入“34”时,输出
通过scanf函数从键盘输入数据 1)当调用scanf函数从键盘输入数据时,最后一定要按下回车键,scanf函数才能接受键盘输入的数据。 2)输入数据值 当键盘输入数据时,输入的数值数据之间用间隔符隔开。列<间隔符>10<间隔符>20 <间隔符>
你好!我想请教你关于利用scanf函数输入时,留在键盘缓冲区的\n(ASCII值为10)的问题。期待你的回答。至于分数,你想要多少,说就行。我昨晚写程序时对scanf在键盘缓冲区留下的字符有疑问,思考不果。看了百度百科上的scanf 词条,说scanf输入遇到空格、跳格、回车才会从缓冲区往变量送字符。于是自己写了以下几个程序思考,还是不果。 程序1 #include "stdio.h" void main() { char a; char b; scanf("%d",&a); scanf("%d",&b); printf("%d %d",a,b); } 键盘输入 97<回车>96<回车> 输出 97 96 问题1:调用第一个scanf输入时,键盘缓冲区所有的字符为97\n,遇到回车,所以缓冲区把97赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为96\n,遇到回车,所以缓冲区把96赋值给b。以上我的分析对吗? 程序2 #include "stdio.h" void main() { char a; char b; scanf("%c",&a); scanf("%c",&b); printf("%d %d",a,b); } 键盘输入 9<回车> 输出
问题2:调用第一个scanf输入时,键盘缓冲区所有的字符为9\n,遇到回车,所以缓冲区把9赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为\n,遇到回车,所以缓冲区把\n赋值给b。以上我的分析对吗?如果对,那程序1中调用第一个scanf时,又为什么不是把97赋值给a后,将\n赋值给b呢?为什么调用第二个scanf时还需要继续输入96<回车>来对b赋值?调用第一个scanf输入时留在缓冲区的\n去哪里了?无端消失了? 程序3 #include "stdio.h" void main() { char a[100]; char b[100]; scanf("%s",a); scanf("%s",b); printf("%s %s",a,b); } 键盘输入 abc<回车>def<回车> 输出 abc def 问题3:从输出结果可以看出,字符数组a和字符数组b都在同一行输出。所以字符数组a的值为{…a?,?b?,?c?},不是{…a?,?b?,?c?,?\n?}。字符数组b的值为{…d?,?e?,?f?},不是{…\n?,…d?,?e?,?f?},也不是{…\n?,…d?,?e?,?f?,?\n?}。以上的分析对吗?如果对,那调用第一个scanf输入时留在缓冲区的\n去哪里了?还有第二个scanf留下\n呢? 程序4 #include
scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。 例如:&a、&b分别表示变量a和变量b的地址。 这个地址就是编译系统在内存中给a、b变量分配的地址。在C 语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系 在赋值表达式中给变量赋值,如: a=567; 则,a为变量名,567是变量的值,&a是变量a的地址。 但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的
地址。 【例4-7】 #include
深入了解scanf()/getchar()/gets()/getch,getche ---------------------------------------------------- | 问题描述一:(分析scanf()和getchar()读取字符)| ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include
ch1 = getchar(); ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; } 程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢?【分析】: 首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! 其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束
scanf函数 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1、格式化说明符; 2、空白符; 3、非空白符; 格式字符说明 %a 读入一个浮点值(仅C99有效) %A 同上 %c 读入一个字符 %d 读入十进制整数 %i 读入十进制,八进制,十六进制整数 %o 读入八进制整数 %x 读入十六进制整数 %X 同上 %c 读入一个字符 %s 读入一个字符串 %f 读入一个浮点数 %F 同上 %e 同上 %E 同上 %g 同上 %G 同上 %p 读入一个指针 %u 读入一个无符号十进制整数 %n 至此已读入值的等价字符数 %[] 扫描字符集合 %% 读%符号 附加格式说明字符表
修饰符说明 L/l 长度修饰符输入"长"数据 h 长度修饰符输入"短"数据 W 整型常数指定输入数据所占宽度 * 星号空读一个数据 hh,ll同上h,l但仅对C99有效。 三、scanf()函数的控制串的使用 例1. #include "stdio.h" int main(void) { int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); return 0; } 运行时按如下方式输入三个值: 3□4□5↙(输入a,b,c的值) 3,4,5 (printf输出的a,b,c的值) (1) &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。 (2) "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。 以下是合法输入方式: ① 3□□4□□□□5↙ ② 3↙ 4□5↙ ③ 3(tab键)4↙ 5↙ 例2. #include "stdio.h" int main(void) { int a,b,c; scanf("%d,%d,%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); return 0; } 运行时按如下方式输入三个值: 3,4,5 ↙(输入a,b,c的值) 或者 3,□4,□5↙(输入a,b,c的值)
scanf(), getchar(), 以及gets()函数注意点 --------------------------------------------------- | 问题描述一:(分析scanf()和gets()读取字符) | ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数出了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include
曾经错的几个地方:(xpsp2,vc6.0环境下) 1.空白符问题 #include
C/C++学习笔记1 - 深入了解scanf()/getchar()和gets()等函数 ---------------------------------------------------- | 问题描述一:(分析scanf()和getchar()读取字符)| ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include
实训scanf函数 实验一: 实验目的:掌握scanf函数 建立并运行下面的C程序。 程序一: #include
getch(); } 程序运行时,输入1234567.890,然后回车。则运行结果为: A=12,b=345,c=67.890000 程序三: #include
转:scanf(), getchar(), 以及gets()函数注意点 ---------------------------------------------------- | 问题描述一:(分析scanf()和gets()读取字符) | ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数出了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: 程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢? 【分析】 首先我们看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! 其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!
问题描述一:(分析scanf()和gets()读取字符)| ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数出了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include
函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。空白符; 3。非空白符; (A)格式化说明符 格式字符说明 %a 读入一个浮点值(仅C99有效) %A 同上 %c 读入一个字符 %d 读入十进制整数 %i 读入十进制,八进制,十六进制整数 %o 读入八进制整数 %x 读入十六进制整数 %X 同上 %c 读入一个字符 %s 读入一个字符串 %f 读入一个浮点数 %F 同上 %e 同上 %E 同上 %g 同上 %G 同上 %p 读入一个指针 %u 读入一个无符号十进制整数 %n 至此已读入值的等价字符数 %[] 扫描字符集合
%% 读%符号 附加格式说明字符表 修饰符说明 L/l 长度修饰符输入"长"数据 h 长度修饰符输入"短"数据 W 整型常数指定输入数据所占宽度 * 星号空读一个数据 hh,ll同上h,l但仅对C99有效。 (B)空白字符 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。 (C)非空白字符 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。 注:scanf()控制串知识就介绍到这里(应该比较齐全了^_^),如有遗漏下次补上。下面将结合实际例程,一一阐述. 三、scanf()函数的控制串的使用 例1. #include "stdio.h" int main(void) { int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d/n",a,b,c); return 0; } 运行时按如下方式输入三个值: 3□4□5↙(输入a,b,c的值) 3,4,5 (printf输出的a,b,c的值) (1)&a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。(2)"%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。
C 语言输入输出函数printf 与scanf 的用法格式printf()函数用来向标准输出设备(屏幕)写数据; scanf()函数用来从标准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>",<参量表>); 其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式控制字符,以"%"开始,后跟一个或几个控制字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,可以是常量、变量或表达式,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。 例如:printf("a=%d b=%d",a,b); 格式控制字符 参量表 正常字符
1.格式控制符Turbo C 2.0提供的格式化规定符如下:━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d十进制有符号整数 %u十进制无符号整数 %f浮点数 %s字符串 %c单个字符 %p指针的值 %e,%E指数形式的浮点数 %x,%X无符号以十六进制表示的整数 %o无符号以八进制表示的整数 %g,%G自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ printf的附加格式说明字符 字符说明 l用于长整型数或双精度实型,可加在格式 符d、o、x、u和f前面
谈谈scanf的几个使用技巧 "哈哈哈,各位高手菜鸟,今天,我来主讲scanf函数的一些用法","什么什么,这小子是不是欺负我们不识字呀!","scanf谁不会!".....台下一大堆臭鸡蛋,烂番茄如下雨般扔上台来,有人喊"这小子铁定欠扁","一定是想来骗稿费!"。。。。。。。。。。。(作者:冤枉呀!写这种冬冬那里有钱可赚,我已穷的快卖血了,呜。。。。。。。。。。。") -------------------------------------------------------------------------------- ------------------------------------------- 今天主要谈三个问题: 一.scanf函数输入格式中的字符串. scanf函数输入格式中也可以含有普通字符串, 但他的含义是这些字符必须在输入中出现 ,例如: int num; Scanf("hello %d", & num); 他的含义是首先要求输入一个hello字符串,然后再输入一个十进制数. 注意在等待输入时 忽略hello与要输入的数之间 的空格,制表符,回车. 因此这两种输入都是正确的: hello 1234 hello1234 二.scanf函数的返回值. 看到一个学弟写的程序: #include
printf("The score put isnt fine. please run and input again."); } else if(num>90) { printf("The grade is A."); } else if((num>80)&&(num<90)) { printf(.................. ............. } .............. } 这个程序是没错,不过如果有人要存心捣乱, 输入时不是输入数字,而是其他的什么字符,那么congratulations, 这个程序崩溃掉了. (^@^) 如何防止出现这种情况,有人通过把数字先读入到数组中,再判断读取的是不是一个数字........., 作法真的好繁. 如果知道scanf函数的返回值的话,这个问题就好办多了.scanf函数执行成功时的返回 值为成功读取的变量数, 如果第一个变量的读取既告失败则返回值为0. 哈哈哈,我们可以通过判断scanf函数执行的返回值, 可以制止用户不正确地输入,从而控制程序的流程. 把上面的程序改改: #include