例子:

#include <stdio.h>
#include <string.h>

main()
{
 char buffer[1024];
 scanf("%s", buffer);
 printf("%d/n", strlen(buffer));
 printf("%s/n", buffer);
}

如输入:------123-34回车      //  -代表空格符

输出:

3

123

===============================================

strlen(string)是有效字符的长度,不含有‘/0’  如"123", 则strlen(“123”)= 3

scanf()函数输入字符串最后回车,将回车前的字符给字符串,系统在字符串尾还自动加个'/0',但最后的回车没有给他所以一般文件处理时还要加个getchar()用来存放回车符。

一.scanf函数输入格式中的字符串.

scanf函数输入格式中也可以含有普通字符串, 但他的含义是这些字符必须在输入中出现
,例如: int num;
          Scanf("hello %d", & num);

他的含义是首先要求输入一个hello字符串,然后再输入一个十进制数. 注意在等待输入时忽略hello与要输入的数之间的空格,制表符,回车.因此这两种输入都是正确的:

hello 1234
          hello1234

二.scanf函数的返回值.

#i nclude <stdio.h>
             main()
             {
                 int num;
                 printf("please input the student's score: ");
                 scanf("%d",&num);

if((num<0)||(num>100))
                 {
                      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(..................
                     .............
                 }
                 ..............
                        
              }

这个程序是没错,不过如果有人要存心捣乱, 输入时不是输入数字,而是其他的什么字
符,那么这个程序崩溃掉了

如何防止出现这种情况,有人通过把数字先读入到数组中,再判断读取的是不是一个数
字........., 作法真的好繁.

如果知道scanf函数的返回值的话,这个问题就好办多了. scanf函数执行成功时的返回
值为成功读取的变量数,
如果第一个变量的读取既告失败则返回值为0.   
 
    我们可以通过判断scanf函数执行的返回值,  可以制止用户不正确地输入,从
而控制程序的流程.

把上面的程序改改:

#i nclude <stdio.h>
             main()
             {
                 int num,int result=0;
                 printf("please input the student's score: ");
                  
                 while(result==0)
         {
     fflush(stdin);  /*  清空输入缓冲区. */
     if(result!=1)printf("Please input a digital score: ");
     result=scanf("%d",&num);  
           }
              ............................
              }
  
         一切OK!

三.scanf函数中一个参数的应用.
 
   
   在scanf函数中,我们可以使用 %c来读取一个字符,使用 %s 读取一个字符串. 但是读取字符串时不忽略空格,读字符串时忽略开始的空格,

并且读到空格为止,因此我们只能读取一个单词,而不是整行字符串.因此一般使用fgets来读取一个字符串.

其实scanf函数也可完成这样的功能,而且还更强大.

这里主要介绍一个参数,%[ ] ,这个参数的意义是读入一个字符集合. [ ]是个集合的标
志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在
此集合的字符便停止. 如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字
符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.

Eg.  输入一个字符串, 这个字符串只含有小写字符.遇到第一个不是小写字符时停止.

scanf("%[a-z],str);

Eg.  想输入一个字符串, 遇到 "." 停止,可设计如下:

scanf("%[^.]", str);

使用这个参数,你可以完成许多强大的功能

#include <stdio.h>
#include <string.h>
main()
{
 char buffer[1024] ;

char string[1024];

scanf("%[a-z]", buffer);

printf("%s/n", buffer);
 scanf("%[^9]", string);
 printf("%s/n", string);
 printf("%d/n", strlen(string));
 printf("%d/n", sizeof(buffer));
}

scanf深究的更多相关文章

  1. va_list深究

    va_list深究 2011-04-21 21:06:11|  分类: C/C++|字号 订阅     VA函数(variable argument function),参数个数可变函数,又称可变参数 ...

  2. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  3. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  4. VS2015使用scanf报错的解决方案

    1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf ...

  5. scanf类型不匹配造成死循环

        int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...

  6. 常用数据结构-线性表及Java 动态数组 深究

    [Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...

  7. WebComponent魔法堂:深究Custom Element 之 标准构建

    前言  通过<WebComponent魔法堂:深究Custom Element 之 面向痛点编程>,我们明白到其实Custom Element并不是什么新东西,我们甚至可以在IE5.5上定 ...

  8. WebComponent魔法堂:深究Custom Element 之 面向痛点编程

    前言  最近加入到新项目组负责前端技术预研和选型,一直偏向于以Polymer为代表的WebComponent技术线,于是查阅各类资料想说服老大向这方面靠,最后得到的结果是:"资料99%是英语 ...

  9. C语言: 运算符,printf,scanf的用法

    运算符/的运算结果和运算对象的数据类型有关,两个数都是in,则商就是int,取整数部分:被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不去掉小数部分如:16/5 == 3:16/5.0 ...

随机推荐

  1. 15KW电动机380V及220V时的电流分别为多少

    15KW电动机380V及220V时的电流分别为多少 当用电电压为380V时:P=UICOSφ/1.72,此时电流为: I=15KW/380V/0.83(COSφ,功率因数)/1.72x1000=27. ...

  2. promise和Rxjs的一点区别

    promise 代码 let promise = new Promise( (resolve) => { setTimeout(() => { resolve('chen'); },200 ...

  3. Linux 系统 /proc/[pid]/stat 文件解释

    转载:http://www.net527.cn/a/caozuoxitong/Linux/2012/0823/24385.html [root@localhost ~]# cat /proc/6873 ...

  4. SourceInsight中文字体

    转载自: http://blog.chinaunix.net/uid-29094179-id-3889999.html 1.正确显示中文注释 1)Options->Style Propertie ...

  5. Replace Pioneer 试用推广

    Replace Pioneer: http://www.mind-pioneer.com 目前合法长期使用Replace Pioneer的唯一方法(除了购买之外): Replace Pioneer过期 ...

  6. 小米手机不能直接运行Android Studio程序

    小米手机不能直接运行Android Studio程序 转载自:http://www.jianshu.com/p/6588c69b42cf Problem description: Android St ...

  7. python笔记16-执行cmd指令(os.system和os.popen)

    os.system 1.如果想在cmd执行python脚本,可以直接用如下指令 python [xx.py绝对路径] 比如我写了个hello.py的脚本,在脚本里面写入内容:print("h ...

  8. Android开发project师,前行路上的14项技能

    导读: 你是否曾渴望回到宋朝? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有如今这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一 ...

  9. jQuery EasyUI 数据网格 - 条件设置行背景颜色

    $('#tt').datagrid({ rowStyler:function(index,row){ if (row.listprice>50){ return 'color:blue;font ...

  10. Informatica 常用组件Source Qualifier之一 概述

     转换类型:主动.已连接 1 Source Qualifier 概述 当你添加关系表或平面文件源定义至映射时,需要将它连接至 Source Qualifier 组件.Source Qualifier ...