分享

输入控制符_scanf()

 217小月月坑 2015-07-20

scanf() --通过键盘将数据输入到变量中
 两种用法:
  1. sacnf("输入控制符",输入参数);
     功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
     ##:系统从键盘接收到的数据只能是字符,所以要使用输入控制符将数据转化为所规定的格式
  2. sacnf("非输入控制符 输入控制符",输入参数);
     功能:与前面一样,但是非输入控制符必须原样输入

 如何使用scanf编写出高质量的代码:
  1. 数据输入的形式必须与输入控制符的格式一样
  2. 使用scanf之前最好先使用printf提示用户以什么样的方式来输入
  3. scanf中尽量不要使用非输入控制符,尤其是不要使用\n
  4. 应该编写代码对用户的非法输入做适当的处理
  
 C语言scanf读取用户输入的机制
  1. 系统将用户输入的数据保存在内存中,当读取时从第一位往后面逐个读取,
  2. 比如输入控制符是%d时,若用户输入123m,此时系统会从1,2,3,m这
      几个字符逐一读取,读到 m 时因为格式不正确,就不再往下读取。
      等到输出时,则会把前面格式正确的 123 输出,而 m 不会被输出即使是
       m 后面跟着正确格式的数据。
  3. 如果输入是m123时,系统读到第一个 m 时格式不正确,所以后面的123不
      再读取,自然也不会输出
  4. 当连续输入两个数据时,比如输入123m 和 456,第一次读取的是123m,输
      出时会把格式正确的 123 输出然后把 m 留着等到下一次接收输入的数据,
   再次读取时会先从 m 开始分析,因为 m 在上一次读取中格式不正确而被留
   在内存中,再次读取时 m 的位置相当于内存中最开始的位置,所以会先从
    m 开始读取。这就是为什么要编写代码来应对用户的非法输入

/*  示例代码  测试输入控制符的格式 **
 *  时间      2015-7-18 21:50     **/

# include <stdio.h>

int main()
{
 int i, j;
 printf("请输入两个整数,中间以逗号隔开:\n");
 scanf("%d,%d", &i,&j);  //&a 表示a的地址 &是一个取地址符
 
 printf("i=%d, j=%d \n", i,j);

 system("pause");

 return 0;

}

/*
 结果分析:
----------------------------
请输入两个整数,中间以逗号隔开:
4,5
i=4, j=5

请输入两个整数,中间以逗号隔开:
4 5
i=4, j=-858993460
----------------------------
 总结:数据输入的形式必须与
   输入控制符的格式一样
----------------------------
*/

 

/*  示例代码 测试scanf非输入控制符的形式 **
 *  时间     2015-7-18 21:37            **/
# include <stdio.h>

int main()
{
 int a;
 printf("请输入一个整数:\n");
 //scanf("%d", &a);  //&a 表示a的地址 &是一个取地址符
 scanf("m%d", &a);
 printf("a=%d\n", a);

 system("pause");

 return 0;

}

/*
 结果分析:
------------------------------------
当使用非输入控制符时,用户必须按格式输入
上例中:
m123是合法输入
123不是合法输入,会显示a的地址
m123n不是合法输入,但是结果是m123
-------------------------------------

*/

/* 示例代码  对用户非法输入做适当处理 **
 * 时间      2015-7-18 22:17         **/

# include <stdio.h>

int main()
{
 int i;
 
 scanf("%d", &i);  //&a 表示a的地址 &是一个取地址符
 printf("i=%d\n", i);

 while ( getchar() != '\n')
  continue;
 int j;
 scanf("%d", &j);
 printf("j=%d\n", j);

 system("pause");

 return 0;

}

/*
 结果分析:
----------------------------
##不加处理代码结果
123m
i=123
j=-858993460
##加入处理代码结果
123m
i=123
345
j=345
----------------------------
 
*/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多