我们收到一个问题,即制作一个程序,用于输入人名及其性别(n号),并将男孩和女孩分成两个独立的阵列。我编写了以下代码,但它不接受第二个循环中的名称和性别。为什么呢?
import java.io.*;
class arrays
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
void main()throws IOException
{
String name="";
System.out.println("enter number of students");
int n=Integer.parseInt(br.readLine());
String[] c=new String[n];//5
String[] b=new String[n];//5
String[] g=new String[n];//5
char[] s=new char[n];
System.out.println("enter the name and gender of "+n+" students");
int i=0;
do
{
System.out.println("enter the data of "+(i+1)+" student");
c[i]=br.readLine();
s[i]=(char)br.read();
i++;
}
while(i<n);
for(int j=0;j<n;j++)
{
if(s[j]=='b'||s[j]=='B')
{
System.arraycopy(c,j,b,j,1);
}
else if(s[j]=='g'||s[j]=='G')
{
System.arraycopy(c,j,g,j,1);
}
}
for(int j=0;j<n;j++)
{
System.out.print("boys are:-"+b[j]);
System.out.println("girls are:-"+g[j]);
}
}
}
答案 0 :(得分:1)
输入的方式是这里的问题。 将do-while循环更改为:
do {
System.out.println("enter the data of " + (i + 1) + " student");
c[i] = br.readLine();
s[i] = (char) br.read();
br.readLine(); // even a br.read(); would work. Used to read newline
i++;
} while (i < n);
答案 1 :(得分:0)
您的问题是,当您br.read()
的行为与readLine()
不同时。 readLine()
读取并包含换行符,但从响应中删除换行符。因此,如果您输入“名称&lt; new-line&gt;”返回“名称”,但“&lt; new-line&gt;”被消耗了。但是,read()只读取一个字符并保留其余字符,因此当您输入“b&lt; new-line&gt;”时“&lt; new-line&gt;”时返回'b'留在输入流上。因此,当您下次使用readLine询问名称时,输入将被解析为下一个“”,恰好是在输入性别时没有字符的左侧新行,因此返回空字符串
您可以使用现有程序和以下输入进行测试:
3 name1 bname2 gname3 b
因此,您需要确保使用新行,或许在阅读完性别后使用br.readLine()
。如果你试图通过阅读额外的字符来消费新行,请注意在某些系统上新行实际上是两个字符。