scanf深究

例子:

#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));
}

时间: 2024-08-24 04:11:40

scanf深究的相关文章

VS2015使用scanf报错的解决方案

1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf_s: 4.无需在程序最前面加那行代码,只需在新建项目时取消勾选"SDL检查"即可: 5.若项目已建立好,在项目属性里关闭SDL也行:我用的VS是中文版的 (1).我将"是"改为"否",编译同样的代码时出现了如下的警告,不是报错: (2).如果不改,

当scanf接收单字符遇上循环

╮(╯▽╰)╭,没想到有一天自己也能就某个标准库函数,谈谈它的某个缺陷. 但我了解,只要有了这开始,"想必是极好的". 这个问题是之前在写一个数据结构的程序时遇到的.现在简化了一下,与大家分享, 一直挺赞同这句话的"Talk is cheap,show me the code". So 代码来了. 下面的代码是有问题的,就是scanf在循环第二次的时候,"%c"接收到的数据不是我们输入的数据,而是换行符. #include <stdio.h

scanf函数用法小记

By francis_hao    Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *format, ...); 描述 该函数通过format扫描标准输入stdin, format包含转换描述说明,如果需要转换,那么转换后的结果存储在format之后的指针参数中,每个指针参数类型必须要正确对应转换说明.如果format中转换说明符的个数,超过了后面的指针参数,那么结果将是未定义的.反过来,如果指针参数的数

scanf() gets() fgets()使用注意事项

1.scanf() 遇到'\n'停止从输入缓冲区中接收,接收完后'\n'还存在于缓冲区中.当输入的字符数少于缓冲区大小时,字符后面有自动补上'\0',当输入字符大于缓冲区时,也直接拷贝到缓冲中,因此缓冲区大小应注意以免产生段错误. 2.gets() 当输入的字符串低于缓冲区长度时,以'\n''\0'结尾,此时缓冲区中什么也没留下:当输入的字符串大于缓冲区长度时,也会全部存入缓冲区中,注意缓冲区大小以免产生段错误,此时缓冲区中什么也没留下. 3.fgets() 从文件字节流中获取指定长度的字符串并

深究angularJS系列 - 第三弹

深究angularJS系列 - 初识 深究angularJS系列 - 第二弹 深究angularJS系列 - 第三弹,我们一起深入探究angular的服务和自定义指令O(∩_∩)O~~ Angular服务 $http: $http是angular中的一个核心服务; $http利用浏览器的xmlhttprequest或JSONP与远程HTTP服务器进行交互; $http的支持多种method的请求,get.post.put.delete.jsonp等. 下面通过JSONP方法进行$http服务的使

窗口迅速关闭的解决办法/scanf/if/for/break

break if的格式 if(a>b) { printf("max=%d\n",a); } else printf("max=%d\n",b); scanf("%s", str2); 窗口迅速关闭的解决办法 刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样.无论是在Visual Studio

c语言scanf详解

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

eclipse 中 scanf 先于printf 出现的问题

原文:http://blog.csdn.net/linux_wgl/article/details/7430561 在写一个C语言时,运行时发现scanf比printf先执行了,在网上找了一下资料,原来是输出缓冲区的问题.解决方法有两个,第一,设置缓冲区为空,即没有缓冲区:第二,每执行printf之后,强制缓冲区.具体方法如下: 在printf之前添加:setvbuf(stdout,NULL,_IONBF,0);设置缓冲区为空. 在每句printf之后添加:fflush(stdout); 测试代

神奇的scanf

神奇的scanf 作为标准输入输出函数组中的一个重要的输入的函数,scanf/sscanf/vscanf函数和printf/sprintf/vsprintf有个重要的区别:如果格式参数和后面的参数不匹配,printf系列函数可能会导致打印出的格式或者数据不是自己期望的 ,而scanf系列函数如果格式参数和后面的参数不匹配,可能导致有待输入的参数附近的内存发生变化,甚至导致程序崩溃. 以下面的函数为例: 8 #include<stdio.h> 9 #include<string.h>