【问题标题】:How do I read a char input in an array?如何读取数组中的字符输入?
【发布时间】:2016-03-16 06:02:17
【问题描述】:

我正在编写一个程序,其中包括设计一个多项选择测试评分器。我声明了一个数组来存储响应。我遇到的问题是,我不知道如何读取每个用户输入(char)来查看它是否正确。我拥有的代码只是一个占位符。我不知道该怎么做。这是我的代码的 sn-p:

for (int a = 0 ; a < response.length ; a++)
{
    System.out.print((a + 1) + ": ");
    Scanner s = new Scanner(System.in);
    response [a] = System.in.read();
    while (response [a] < 'A' || response [a] > 'D')
    {
        System.out.println ("Invalid input. Enter answers with A, B, C, or D only!");
        response [a] = System.in.read();
    }
}

【问题讨论】:

  • 你为什么在循环中创建Scanner而不使用它。即使您确实打算使用它,也不要在循环内创建。在循环之前创建。 --- 通常将迭代器变量命名为i,而不是a。 --- System.in.read() 只从输入中读取 1 个字符,但在您按 Enter 之前不会读取任何内容,然后您在该行上键入的所有内容都会被读取,一次一个字符。
  • @Andreas 我在循环之外创建了扫描仪,但是如何读取字符?

标签: java arrays char


【解决方案1】:

我不完全确定您要达到的目标,因此我将对我的答案做出一些假设:

用户在每个答案后按回车键,如果这是一个多项选择测试,这对我来说似乎很自然。

您将知道正确的答案,并且只需要检查输入是否正确。

char [] correctAnswers = {'A', 'B', 'C', 'A'};
Scanner in = new Scanner(System.in);

for(int i = 0; i < correctAnswers; i ++){
    System.out.println("Please input answer:");
    String valueString = in.nextLine().toUpperCase();
    if(valueString.length() != 1){
        System.out.println("Answer invalid. Please only type one character");
        i--;
    } else {
        char answer = valueString.charAt(0);
        if(correctAnswers[i] == answer)
            System.out.println("Correct");
        else
            System.out.println("Wrong");
    }
}

这个示例应该可以解决问题。

替代方案

如果用户要输入他的所有答案然后按回车,您可以按如下方式访问每个字符:

char [] correctAnswers = {'A', 'B', 'C', 'A'};
Scanner in = new Scanner(System.in);
System.out.println("Please input " + correctAnswers.length + " answer(s):");
String answerString = in.nextLine().toUpperCase();

if(answerString.length() != correctAnswers.length){
    System.out.println("Incorrect number of answers entered");
} else {
    for(int i = 0; i < answerString.length; i ++){
        if(correctAnswers[i] == answerString.charAt(i)){
            System.out.println("Answer " + (i + 1) + " Correct");
        } else {
            System.out.println("Answer " + (i + 1) + " Wrong");
        }
        count ++;
    }
}

【讨论】:

  • 在第一个示例中,您应该验证该行是一个字符长。在第二个示例中,您应该在循环之前验证 answerString.length() == correctAnswers.length,因此您还可以检测到“输入的答案太少”。最后,最后 2 个 println 语句应该在 count 值周围有一些空格。
  • 根据您的 cmets @Andreas 编辑了我的答案。谢谢。
  • 看起来不错。现在,既然您无论如何都使用count 变量,我建议切换到常规索引for 循环并使用answerString.charAt(i)。您还想打印(i + 1),因此答案编号为 1-4,而不是您现在所做的 0-3。
【解决方案2】:

我不清楚您打算如何阅读输入,但如果您希望用户为每个问题的答案输入输入,您可以修改代码如下

    for (int a = 0 ; a < response.length ; a++)
        {
            System.out.print((a + 1) + ": ");
            Scanner s = new Scanner(System.in);
            response [a] = s.next();
            while (response [a] < 'A' || response [a] > 'D')
            {
                System.out.println ("Invalid input. Enter answers with A, B, C, or D only!");
                response [a] = s.next().charAt(0);
            }
        }

s.next() 将输入作为字符串,因此您可能需要在循环中尝试将第一个字符取出。

如果您打算从某个文件中读取输入而不是读取过程会有所不同,则可以查找。

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2016-07-23
    • 2016-11-30
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2022-01-13
    • 2021-02-20
    • 2020-07-24
    相关资源
    最近更新 更多