的所有秘密都在这里)
0.目录1.scanf()的作用和用法2.返回值3.占位符重点介绍了%c和%s4.赋值忽略符1.scanf函数的作用和用法printf函数负责输出scanf函数则负责输入从键盘读取数据scanf函数的基本用法当个程序运行到scanf函数时会停下来等待用户才能够键盘输入然后按下回车键之后scanf()会处理用户的输入将数据存入变量是按下回车键之后scanf函数才会进行处理在没有按下回车键之前用户输入的数据都在缓冲区存放缓冲区是一块内存scanf在缓冲区依次读取数据scanf()的第一个参数是格式字符串里面会放入占位符跟printf一样占位符的作用是告诉编辑器如何处理用户输入的数据比如我输入了一个65scanf会告诉编辑器是按照int类型处理留出4字节的内存还是按照short类型处理留出2字节的内存其余的参数就是用户输入的变量inti0;scanf_s(%d,i);printf(%d,i);在上面这个程序中scanf中的%d表示用户输入的应该是一个整数变量i前我们加一个取地址符取变量i的地址将输入的数据存放入变量中地址在指针中会深入讲解在上面的程序中如果我输入A这个字符按下回车键输出的是0是为什么呢因为%d告诉编进器用户输入的是一个十进制整数但是我却输入了一个Ascanf就没有读取注意取地址符是必须加的inti0;//scanf输入多个值intj0;floatx0.0;floaty0.0;scanf(%d%d%f%f,i,j,x,y);printf(%d\n,i);printf(%d\n,j);printf(%f\n,x);printf(%f\n,y);上面我编写了一个scanf输入多个值的程序如果我们这样输入12131.21.3输出的结果就是12131,0,0.000000,0.000000,为什么会出现这样的情况在用户输入数据时scanf在读取到空格换行符就会停下来再次读取时就会跳过空白换行继续读取如果读入到不匹配的数据就会停止读取所以数据与数据之间有多个空格换行都不影响读取如果我按照12131.21.3这样输入scanf首先读取12131然后碰到了小数点%d告诉编辑器用户输入的是一个十进制整型数不会有小数点所以就停止读取将12131存入i中再继续读取第二个占位符也告诉编辑器用户输入的应该是一个十进制整型数但是在读取时遇到了小数点于是就停止读取后面的就都没有读取输出的结果就0没有读取到的数就存在缓冲区等待下一次读取如果我输入的是12 13 1.3 1.2scanf在读取时根据第一个占位符来读取读到12十进制整数遇到空格停止读取将数据存入到i再根据第二个占位符跳过空格接着读取下面的数再存入第三第四个同理总结scanf()在处理用户输入的数据的原理是用户输入先放缓存等到按下回车键之后按照占位符对缓存进行解读解读用户输入时会从上一个遗留的第一个字符开始直到读完缓存或者遇到第一个不符合条件的字符为止编写一个程序intx;floaty;scanf(%d,x);printf(%d\n,x);scanf(%f,y);printf(%f\n,y);这样一个程序我们输入-13.45e12##0输出的结果是-13449999994880.000000我们来解读一下这个过程我们输入的首先放入缓存按下回车键之后scanf开始按照占位符进行解读在缓存区中首先遇到了几个空格会自动跳过空格然后遇到了-13-13就是整数再向后读读到了小数点整数不能有小数点所以就停止读入将数据存放后接着从小数点开始读这是我们不用再输入数据因为缓冲区中的还没有读完小数点第二个占位符解释用户输入的是小数可以有小数点就接着读读到井号小数没有井号就停止读入存入数据2.scanf()的返回值scanf具有返回值它的返回值是一个整数int类型具体是什么呢就是成功读取变量的个数(成功读取并赋值给变量的个数没有读取任何项就返回为0如果在成功读取之前发生了读取错误或者读到文件的结尾则返回常量E0F(-1)intmain(){//scanf的返回值inta0;intb0;floatf0.0f;intrscanf(%d %d %f,a,b,f);//创建int类型变量来存放返回值printf(%d %d %f\n,a,b,f);printf(%d,r);}编写一个上面的程序这里要注意scanf的返回值是一个int类型的数所以你就要创建一个int 类型的变量来存放它的返回值再联系一下sizeofsizeof的返回值是数据类型所占的字节数但是并没有规定是int,short,long不同的环境就不同所以就直接规定了返回值是size_t类型我们输入12 12 1.3返回得到的值是3这里在编写的时候我就犯一个错误把换行符\n加到了scanf的格式字符串后面可能是一直写printf顺手了这样的结果就是即使我输入了3个数据无论怎么按下回车键都没有办法进行读取所以还是要注意我输入2 1 返回的值就是2成功读取了2个我如果输入2 返回值就是1成功读取了1个这里还有一个很有意思的例子就是如果我输入的是1 1.1 1这个返回值是多少这个返回值是3中间的过程是scanf先读1遇到空格跳过再读下一个读了1然后读到了小数点整数不可以有小数点就停止读了再开始都下一个下一个读了小数点读到了1遇见空格就停止读取了所以输出的结果就是1 1 0.100000,r33.占位符scanf的占位符和printf的占位符一样占位符数据类型%c字符%d整数%ffloatl类型的浮点数%lfdouble类型的浮点数%Lflong double类型的浮点数%s字符串%[]在[]中指定一组匹配字符比如%[0-9]遇到不在集合中的字母时匹配就会停止这里要注意在printf中%f既可以对应float类型又可以对用double类型但是在scanf中%f就是对应的float类型double类型就只能用%lf这里如果我类型用错了会发生什么intmain(){inta0;floatf0.0;scanf(%d %lf,a,f);printf(%d %f\n,a,f);}这里scanf中float 对应的本来就是%f现在我用%lf我运行之后就发生了异常直接报错所以类型一定要匹配上%c所有的占位符除了%c以外都会忽略起首的空白字符%c就不会intmain(){charch;scanf(%c,ch);printf(%c\n,ch);}编写一个这样的程序如果我们输入A输出的结果就是 ,没有跳过空格如果想要跳过前面的空格就要在%c前加一个空格intmain(){charch;scanf( %c,ch);printf(%c\n,ch);}在第三行我们在%c前加了一个空格我输入A输出的结果就是A看下面这个程序intmain(){//%c不会忽略起首的空白字符charch0;inta0;scanf(%d %c,a,ch);printf(%c\n,ch);printf(%d\n,a);}这个程序在我开始运行前我的预料是输入12 A会输出 12但是却输出了A,12在我问过AI之后发现scanf(%d %c,a,ch);这样写其实就是已经给%c前加了空格所以就会自动跳过前面的空白如果想要达到我想输出的效果就是不跳过前面的空白就这样写intmain(){//%c不会忽略起首的空白字符charch0;inta0;scanf(%d%c,a,ch);printf(%c\n,ch);printf(%d\n,a);}scanf(%d%c,a,ch);这样就不会跳过前面的空白输出的结果就是 12如果我输入12之后马上按下了一个回车scanf读到就是\n所以输出的ch就是\n,输出时就是两个 之间有一个换行%s%s这里也要讲一下%s的规则是从当前第一个非空白字符读起直到遇到空白字符为止intmain(){chararr[20];scanf(%s,arr);printf(%s,arr);}比如说我输入了一个字符串i want eat apple我希望它输出的也是这个但是却输出i,后面的都没有输出是因为读完i之后遇见空格就不读了所以这个所读的字符串不包含空格只能读单词不能读句子并且scanf遇到%s占位符也会在字符串变量的结尾存储一个空字符\0如果我们就想读取带有空白字符的字符串我们可以这么做intmain(){chararr[100];scanf(%[^\n]s,arr);printf(%s\n,arr);}%[^\n]s这个符号意思就是让scanf一直读一直读直到读到\n就不读了我输入一个i want eat an apple就会输出i want eat an apple另一种方法就是fgets–后面就会学到这里不得不提到scanf在读入字符串时就不会检测字符串时不是超过了数组的长度会超过数组的边界这个可是很危险所以scanf这个函数其实就是有一点不安全的所以在使用%s占位符的时候应该指定读入字符串的最长长度即%[m]s[m]是一个整数表示读取字符串的最大长度其他的字符会被丢弃来限制长度intmain(){charch[5];scanf(%s,ch);printf(%s,ch);}这个我输入ASFFGGG这个数组只能输入5个我输入了7个虽然也会输出但是就是会引发异常越界访问了intmain(){//限制字符串读入的最长长度charch[5];//[][][][][\0]scanf(%4s,ch);printf(%s,ch);}我们这个数组是5个空间但是你要记住scanf在读取字符串之后会在字符串后面加一个\0所以我们就要为\0预留一个空间所以只剩写了4个空间如果我们输入了5个就会发生异常所以我们就要限制读取的最大长度我们在%后加上4就代表我要限制最多读入4个字符其他的字符都不读我输入abcded就会输出abcd这样就相对来说就比较安全了赋值忽略符intmain(){//赋值忽略符intyear0;intmonth0;intday0;scanf(%d-%d-%d,year,month,day);printf(%d %d %d\n,year,month,day);}这里我让用户在输入是必须按照一个格式进行输入比如2026-10-1这样输出的结果才是正确的输出2026 10 1但是如果用户没有按照要求来比如输入了一个2026 10 1这个输出的结果就是2026 0 0scanf在读取的时候读了2026遇到空格再读取下一个本来是应该遇到-但是没有遇上所以格式不匹配于是就没有接着读所以month和day都没有读入值都是0那我就想可以不可以就是说我管是输入2026 10 1还是2026\10\12026-10-1,都可以正确读取intmain(){//赋值忽略符intyear0;intmonth0;intday0;charc10;charc20;scanf(%d%c%d%c%d,year,c1,month,c2,day);printf(%d %d %d\n,year,month,day);}我创建两个char型的变量把中间的不论是空格-\都当成字符虽然本来就是字符我在scanf中读取但不使用这样一来不管我输入的哪一个字符只要是字符就可以正确输出2026-10 12026\10-1这些都可以但是这样要创建两个变量有点麻烦而且我也没有输出没有使用既然这些字符我读了但是没有使用那我可不可以读了然后就扔了intmain(){intyear0;intmonth0;intday0;scanf(%d%*c%d%*c%d,year,month,day);printf(%d %d %d\n,year,month,day);}我们使用%c我们在读入了一个整数2026然后读入了一个字符然后我就直接扔了然后再读下一个这样我我不管是输入什么字符直接扔了我还可以正确输出也没有创建多余的变量intmain(){//赋值忽略符返回值intyear0;intmonth0;intday0;intr0;rscanf(%d%*c%d%*c%d,year,month,day);printf(%d %d %d\n,year,month,day);printf(%d\n,r);}这个返回值就是3虽然我们输入了5个数据但是真正输入并且赋值给变量的只有3个其他的都扔了所以赋值忽略符就是在任何的%后面加一个*这个占位符就不会有返回值直接丢弃intmain(){inta0;intb0;bscanf(%*d %d %*f,a);printf(%d\n,a);printf(%d\n,b);}看最后一个例子我输入了3个数一个整数一个整数一个浮点数但是除了要赋给a的那个数其他都被扔了返回值也只有1而且我也之创建了一个变量a和一个存放返回值的变量b关于scanf()知识就分享到这里了多多点赞收藏我们下篇笔记再见