例子:

#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. SQL SERVER SQLOS的任务调度--微软亚太区数据库技术支持组 官方博客

    https://blogs.msdn.microsoft.com/apgcdsd/2011/11/23/sql-server-sqlos/

  2. EatCam Webcam Recorder Pro

    EatCam Webcam Recorder Pro Webcam Recorder records webcams to AVI, FLV, WMV files and watch them whe ...

  3. The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDa

    错误原因是在于修改了PageAdapter,却没有调用 PageAdapter的nodifyDataSetChanged方法.注意刷新数据 需要在主线程. 今天在做项目时出现了这个问题,一直报没有调用 ...

  4. BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别

    汉语unicode编译方式,BIG5是繁体规范,GB是简体规范 GB是大陆使用的国标码,BIG5码,又叫大五码,是台湾使用的繁体码. BIG5编码, GB编码(GB2312, GBK, ...), U ...

  5. 需要掌握哪些python标准库和三方库?

    讨论参考:https://www.zhihu.com/question/20501628 库太多了,根据需要使用相应领域的三方库:至于对于企业常用的三方库,可以参考热门招聘网站的招聘说明

  6. 在flask中使用jsonify和json.dumps的区别

    转载:https://blog.csdn.net/Duke_Huan_of_Qi/article/details/76064225

  7. Single Number and Single Number II

    [] Given an array of integers, every element appears twice except for one. Find that single one. [] ...

  8. HDU 4901 The Romantic Hero 题解——S.B.S.

    The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  9. uva 816 abbott&#39;s revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  10. Linux下C获取所有可用网卡信息

    在Linux下开发网络程序时,经常会遇到需要取本地网络接口名.IP.广播地址.子网掩码或者MAC地址等信息的需求,最常见的办法是配合宏SIOCGIFHWADDR.SIOCGIFADDR.SIOCGIF ...