编程语言提供最基本的输入输出,输入一个预期的数据也不是看起来那么简单,如下一一展开。
不同输入形式
- C语言scanf提供格式串输入,程序员负责配置正确的格式,比如%d整型,%s为字符串。可能出现格式串和变量格式、个数不完全匹配,输入的数据异常、错位。但,因为参数是值传递,变量必须取地址传入,才能正确更新。
- C++引入了cin标准输入流对象,使用>>运算符和变量即可,注意变量不用取地址,利用了引用概念,代码舒适度较高。
- Java需要额外创建Scanner对象,显得麻烦。
- Python提供input函数输入,本身属于解释型语言,返回值类型为字符串,输入的变量可以被转换成符合要求的格式,比如用int函数转换为整数。
- 其他脚本语言用法一般都比较简单,比如read或input即可输入。
- Pascal的输入很简单,用Read或Readln即可(后者和前者区别是否读取一整行,多次调用Readln和多次调用Read是有区别的),多个变量可以直接放入参数。例如:
Read(a, b, c);
带额外字符的输入
额外字符有分隔作用,对于输入反而会产生误解。
- C语言scanf(“%d,%d”, &a, &b)需要输入”,”才能正常解析。就像去银行办业务申请表单有自己的格式,符合格式才能办成功。
- C#没有C语言简洁,需要用Split方法截断:Console.ReadLine().Split(',').
输入不成功
- C语言格式和输入数据不匹配,属于错误,当前变量的数值不确定,输入缓冲区数据被保留给下一个格式数据。
- 在同一套运行时,不同输入函数共享输入缓冲区,如果前面函数输入不成功,缓冲区数据会保留给下一个输入函数,例如C语言scanf和getchar,如scanf执行后还剩下字符未处理,接下来getchar函数会继续用到前面的字符。
输入的忽略字符
- scanf默认会忽略任何空白字符(换行、空格、制表符),哪怕是%c格式输入一个字符。
- getchar函数不会忽略空白字符,这可能造成某些时候一些不预期字符的问题,需要格外注意。
输入需要回车符才能接收字符?
一般而言,标准输入是行缓冲,当没有按回车符之前,所有的输入都在缓冲区中,不会投递给程序输入。不要被输入时会回显混淆,它只是终端为了让使用者清楚输入了什么,只是且仅仅为了显示出来。
- C# Console.Read() 方法在没有输入回车之前,已输入的字符都不会被处理。C# 2.0引入Console.ReadKey() 方法,它和前面不同,会即时反馈输入的字符,不需要按回车按键。
安全的输入
- C语言的scanf对缓冲区限制很小,显然容易造成一些漏洞。
- scanf_s 是Microsoft 特定的扩展,增加了额外的缓冲区大小限定不会超出限制。