5、从键盘上接收一个字符型数据的方法有哪几种?
这篇教程非常详细了 借花献佛 :)
java控制台输入
0 引言
从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流。有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择。下面来看一下,各个版本中如何从控制台中读取数据以及各自的优缺点。
1 JDK 1.4 及以下版本读取的方法
JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的输入流,再桥接至字符流从字符流中读入数据。示例代码如下:
import java.io.IOException;
import java.io.InputStreamReader;
public class Test1 {
public static void main(String[] args) {
String str = readString("请输入字符串:");
System.out.println("readString 方法的输入:" + str);
}
private static String readString(String prompt) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
try {
System.out.print(prompt);
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
从上面的代码段来看,这种控制台输入的方法非常地麻烦,为了能读取整行的数据,采用了BufferedReader类来进行处理,而且在读取的过程中还需要捕获IOException。不过这是 JDK 1.4 及以下版本中从控制台读取数据唯一的办法。还有一种非控制台读入数据的办法,就是采用 Swing 中的JOptionPane,会弹出一个非常漂亮的输入对话框让使用者输入数据,但这是一种比较另类的做法,不推荐使用。
import javax.swing.JOptionPane;
public class Test2 {
public static void main(String[] args) {
String str = readStringFromDialog("请输入字符串:");
System.out.println("readStringFromDialog 方法的输入:" + str);
}
private static String readStringFromDialog(String prompt) {
return JOptionPane.showInputDialog(prompt);
}
}
上面的两种方法都有个共同的缺点——只能读取字符串,若需要读取其他类型的数据需要手工进行转换。
2 JDK 5.0 读取的方法
从 JDK 5.0 开始,基本类库中增加了java.util.Scanner类,根据它的 API 文档说明,这个类是采用正则表达式进行基本类型和字符串分析的文本扫描器。使用它的Scanner(InputStream source)构造方法,可以传入系统的输入流System.in而从控制台中读取数据。示例代码如下:
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
String str = readString5("请输入字符串:");
System.out.println("readString5 方法的输入:" + str);
}
private static String readString5(String prompt) {
Scanner scanner = new Scanner(System.in);
System.out.print(prompt);
return scanner.nextLine();
}
}
从代码量上来看,Test3比Test1少了很多的代码,核心代码只有两行。其实并不是Scanner将控制台输入给简单化了,只是在其内部的实现中已经将IOException处理了,而且采用InputStreamReader来一个字符一个字符进行扫描读取的(嘿嘿,它本身就是个扫描器),只是 Scanner做了更高层次的封装。
Scanner不仅可以从控制台中读取字符串,还可以读取除char之外的其他七种基本类型和两个大数字类型,并不需要显式地进行手工转换。 Scanner不单单只能扫描控制台中输入的字符,它还可以让读入的字符串匹配一定的正则表达式模式,如果不匹配时将抛出 InputMismatchException异常。
使用System.in作为它的构造参数时,它只扫描了系统输入流中的字符。它还有其他的构造,分别可以从文件或者是字符串中扫描分析字符串的,具体的使用方法可以参考 API 文档说明。
3 JDK 6.0 读取的方法
从 JDK 6.0 开始,基本类库中增加了java.io.Console类,用于获得与当前 Java 虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据。示例代码如下:
import java.io.Console;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
String str = readString6("请输入字符串:");
System.out.println("readString6 方法的输入:" + str);
}
private static String readString6(String prompt) {
Console console = System.console();
if (console == null) {
throw new IllegalStateException("不能使用控制台");
}
return console.readLine(prompt);
}
}
在Test1和Test3中,输入数据前的提示信息需要使用System.out.print();来输出,但是使用基于Console的Test4类,可以在方法参数中直接放入提示信息。
如果需要在控制台中输入密码等敏感信息的话,像在浏览器或者是应用程序中那样显示替代字符,在 JDK 6.0 以前的做法是相当麻烦的(具体的做法可以参考《Java 编程语言中的口令屏蔽》一文),而使用Console类的readPassword()方法可以在控制台上不回显地输入密码,并将密码结果保存在char 数组中,根据 API 文档的建议,在使用后应立即将数组清空,以减少其在内存中占用的时间,以便增强安全性。
但是,Console也有一些缺点,根据ConsoleAPI 文档的说明:
虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。
通过上面的文档说明可以看出,在使用 IDE 的情况下,是无法获取到Console实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序,而Test1和Test3就没有这种限制。
4 总结
以上囊括了 Java 中各种版本从控制台中读入数据的方法,将对它们的优缺点进行了分析。下面给出了一些使用建议,可供参考:
JRE 1.4 或以下版本的情况下,没得选择只能采用Test1或者是非控制台读入的Test2的方法。
JRE 5.0 的情况下,建议使用基于Scanner的Test3的方法,更方便地进行数据读取。
JRE 6.0 的情况,并且只在字符界面的控制台下运行时,采用Test4的方法,如果需要读入像密码之类的敏感数据,为了安全性考虑也必须使用Test4或者是自行实现。如果需要读入除字符串类型之外的其他数据类型,建议使用基于Scanner的控制台输入。
input ,accept, wait三种命令
input 字符表达式 to 内存变量 &&可接受任何一种数据,但必须带上定界符
比如 input “请输入一个数" to aa &&此时屏幕上会出现“请输入一个数",等待你输入一个数,即给变量aa赋值
accept 字符表达式 to 内存变量 && 只能接受字符型数据,因此不需要带上定界符
比如 accept 很好 to aa &&意思是将字符型数据“很好”赋值给变量aa
wait [字符表达式] [to 内存变量][window [AT,]]
[nowait] [clear/noclear/timeout
&&此命令用来显示提示信息, 方括号的内容表示可选的选项
AT函数用来指明在窗口的哪个地方显示提示信息
nowait表示系统将不等用户按键直接往下执行,即不会暂停
noclear表示不关闭弹出来的信息提示窗口,直接往下执行
timeout用来设定等待时间(秒数),一旦超时就不再等待用户按键自动往下执行
比如 wait "输入无效,请重新输入。。" window timeout 5
表示在主窗口右上角显示提示信息 "输入无效,请重新输入。。" ,之后程序暂停执行,当用户按键后或超过5秒钟时,提示窗口关闭,程序继续往下执行
从键盘上接受一个字符串(字符串中可能包含汉字、英文字母、空格等等...
int main(){ char a[MAX];int b,en=0,ch=0,nu=0,ot=0,sp=0;\/\/en 英文字母数,ch 中文字符数,nu 数字数量,ot 其他字符数量,sp 空格数量 gets(a);\/\/接收键盘输入,存储在a[]中 for(b=0;b<MAX;++b) \/\/依次取出从键盘接收的数据并进行比较,把相应的计数器加一 { if(0==a[...
C语言里的getchar()怎么用?
getchar()是c语言中的一个函数,可以用它来赋一个字符的值。例如:char a;a=getchar();当你在键盘上输入一个字符后按回车;(输入u)那么字符变量a的值就是'u'了.main() { char c; c=getchar(); \/*从键盘接收一个字符,只能一个,多于一个其余作废*\/ putchar(c); } 还可以这样用: m...
从键盘上接受一个字符串(字符串中可能包含汉字、英文字母、空格等等...
ACCEPT "请输入字符串:" TO zfc &&接收字符串 I=0 B=""&&B赋值为空串 用嵌套循环每字节依次比较,若为单字节则取出子串累加,否则判断下一字节,最终取出只含字母、数字、空格的字符串赋值给B 外层循环 DO WHILE I<=LEN(zfc)内层循环 DO WHILE ISLEADBYTE(SUBSTR(zfc,I,1))I=I+1 END...
如何用c语言编写一个能够正确运行的程序?
“ scanf (“%s”,&name)——(如果name是数组名)从键盘接收一个字符串,存储到以name为首地址的数组中(注意这里虽意义与scanf (“%s”,name)不同,但效果与scanf (“%s”,name)一样); ”我表示深深怀疑,虽然没有直接测试。很可能有错,希望自己去写代码实验一下。=== 以下为我的 u...
编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上...
;从键盘输入四位16进制数,以2进制、10进制输出 ;=== DATA SEGMENT STR1 DB 'INPUT A HEX NUM: $'HEX DB 5 ;计划输入的字符个数(含回车符)NNN DB 0 ;存放实际输入的字符个数 DB 5 DUP(?)BIN DW ? ;输入数字的二进制形式的存放单元 ERR DB 0AH,...
如何编写一个汇编程序,要求“从键盘接收一个四位的16进制数,并在终端上...
试编写一段程序,要求对键盘输入的小写字母用大写字母显示出来。编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。从键盘上输入一串字符,将其中的小写英文字母变换...
...试编写一汇编语言程序,要求从键盘接收一个四位的十进制数,并在终端...
;从键盘接收一个四位的十进制数,并在终端上显示与它等值的二进制数 ;=== DATA SEGMENT STR1 DB 'INPUT A NUM: $'HEX DB 5 ;计划输入的字符个数(含回车符)NNN DB 0 ;存放实际输入的字符个数 DB 5 DUP(?)BIN DW ? ;输入数字的二进制形式的存放单元 E...
试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上...
程序中,如是字符‘A(41H=1000001B)~F(46H=1000110B)’的话,执行AND AL, 0FH 后,将化为0001B~0110B (十进制1-6),而数值0AH=十进制10 D,与0001B相差为9,所以需跟上 ADD AL, 9 进行校正.另程序中,DEL CH 应为DEC CH 之误....
Java中如何从键盘接收一个字符
不过这是 JDK 1.4 及以下版本中从控制台读取数据唯一的办法。还有一种非控制台读入数据的办法,就是采用 Swing 中的JOptionPane,会弹出一个非常漂亮的输入对话框让使用者输入数据,但这是一种比较另类的做法,不推荐使用。import javax.swing.JOptionPane;public class Test2 { public static void main(...
编写简单的java程序,实现从键盘接收一个字符串的输入,并将该字符串显示...
void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); \/\/先创建一个BufferReader对象br String Str = br.readLine(); \/\/创建字符串Str并接受输入 System.out.println(Str); \/\/输出 }} ...
解陶艾力: getchar() int main() {char c = getchar();return 0; }
巍山彝族回族自治县19658421406: JAVA语言编程中如何接收一个从键盘中输入的数字或其他字符? - ?
解陶艾力: 1 2 3Scanner sc =newScanner(System.in); intn = sc.nextInt(); // 接受数字 String str = sc.nextLine(); // 接受字符
巍山彝族回族自治县19658421406: C++中从键盘读取单个字符的函数及头文件 - ?
解陶艾力: cin.get() cin是istream类的对象,get(),是其成员函数. 头文件用iostream就可以了
巍山彝族回族自治县19658421406: 【VB】编写一个程序,从键盘接收一个字符串,并将其显示在窗体上. - ?
解陶艾力: a = InputBox("请输入一个字符串") Print "你输入的字符串是:"; a
巍山彝族回族自治县19658421406: java从键盘接受一个字符串,并逆顺输出 - ?
解陶艾力: public static void main(String[] args) { //创建对象 Scanner sc = new Scanner(System.in); System.out.println("请输入字符串"); String line = sc.nextLine(); char[] chs = line.toCharArray(); System.out.println("倒序输出:"); for(int i = chs.length; i>0; i--){ System.out.print(chs[i-1]); } } 获取字符串,转换成字符数组,反正输出就行.
巍山彝族回族自治县19658421406: 怎样从键盘上接受字符用java - ?
解陶艾力: public class Test { public static void main(String[] args) {Scanner canner = new Scanner(System.in);System.out.println(canner.next());} }
巍山彝族回族自治县19658421406: c语言中,如何能只从键盘接收数字? - ?
解陶艾力: 用getch()函数一个字符一个字符的接收,然后进行判断.DOS下没有办法像Text控件一样打个对号就可以. 还有一种办法就是调用中断,不过比较费事,用getch()就能达到想要的效果.
巍山彝族回族自治县19658421406: 从键盘接受一个字符串 汇编语言 - ?
解陶艾力: 调试通过! DATAS SEGMENTmeg1 db 'Input:$'meg2 db 0dh,0ah,'$'meg3 db 20 dup(0) DATAS ENDS STACKS SEGMENT;此处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS ...
巍山彝族回族自治县19658421406: 从键盘接收一字符串,将字符串中的所有数字字符转移到所有非数字字符之 - ?
解陶艾力: #include<stdio.h> #include<string.h> int main() { char s[100],num[100],ds[100]; int i,j=0,k=0; scanf("%s",s); for(i=0;s[i]!='\0';i++) { if(s[i]>'0'&&s[i]<'9') num[j++]=s[i]; else ds[k++]=s[i]; } num[j]='\0'; ds[j]='\0'; printf("%s%s",ds,num); return 0; } 程序没错,只是少了两行
巍山彝族回族自治县19658421406: 从键盘接收一个字符,如果该字符是大写字母,将其转化为小写字母并输出C语言 - ?
解陶艾力: #include <stdio.h> #include "ctype.h" main() {char a;a=getchar();if(isupper(a)!=0) a=tolower(a);printf("%c\n",a); }