質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Java

    15776questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaのBufferedReader(readLine)の改行について、改行しない設定にはできますでしょうか。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,379

現在、コマンドプロンプト内で数値を入力し、計算を行うプログラムを書いています。

その中で、
底辺___cm
高さ___cmと表示したいのですが(___に数値を入力する)

int number = shape1.getNumber();
        double[] params = new double[number];
        String[] paramNames = shape1.getParamNames();
        System.out.println("\n数値を入力してください");
        for (int i = 0; i < number; i++) {
            System.out.print(paramNames[i] + ":");
            try {
                params[i] = Double.parseDouble(br.readLine());
                System.out.println("cm");
            } catch (NumberFormatException e) {
                System.out.println("数値を入力してください");
                i--;
            }
        }


と書いたら

![イメージ説明
のように表示がされます。
BufferedReaderのreadLineメソッドは一行ずつ読み込み改行をしていく仕様となっているようなのですが、何か方法はありますでしょうか?

最初からcmが表示されていても、底辺の値を入力してからcmが表示されるようにでも、どちらでも大丈夫です。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

まずなぜそうなるのかという理由を説明します。BufferedReader が原因ではないかとの事でしたが、実際にはそれのコンストラクタに渡している System.in が理由です。リダイレクト等を行っていないのであれば System.in は端末に紐づけられており、それは標準的に行入力になります。つまり端末の仕様になるのです。


 ここからうんちく

一件なんだそれはと思われるかもしれませんが、「行で文字入力を確定する」という事は間違ってタイプしてバックスペースを押して再度打ち直して、といったキー操作が最終の文字列で確定出来るという良さを持っています。もし1文字タイプするごとに結果が返ってしまったらバックスペースキーもプログラムが扱わないといけなくなります。

つまり端末は標準で入力された物を画面にも出しつつ行を編集する機能を提供してくれている訳です。それを読み取っているのが readLine になります。readLine は読むだけですので途中で行ったバックスペースキーの入力等は知りません。あくまで行が確定した段階の文字列だけが読み取られます。


色々と書きましたが答えを言うと「できません」が回答になります。ほんとに出来ないのかと言われると幾つか案があります。ただしどれもそぐわないと思います。

  1. 端末のキー入力を読み込んで処理する
    バックスペースや矢印キーなど多くの処理を自分で実装する必要があります。

  2. CTRL-D で確定する
    readLine が読み取れる様になるのは、行が確定する(エンターキーが押される)か EOF (ストリームの終わり)が条件です。CTRL-D をタイプすると後者を送る事が出来ます。ただしこれが動作するのは UNIX だけになります。キャプチャを見させて頂く限り Windows ぽいので、残念ながら使えません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 17:41

    素晴らしく詳しい解説ありがとうございます。どこのサイトよりも分かりやすくて助かりました!

    キャンセル

+1

解説はmattnさんので十分かと思います。

最初からcmが表示されていても

とのことなので、こんなイメージ?という風に修正してみました。

for (int i = 0; i < number; i++) {
    System.out.print(paramNames[i] + "(cm):");  // ここでcmを表示
    try {
        params[i] = Double.parseDouble(br.readLine());
        //System.out.println("cm"); // 削除
    } catch (NumberFormatException e) {
        System.out.println("数値を入力してください");
        i--;
    }
}

追記:多分「底辺」と「cm」の間に空白があって、そこに入力させるという想定では?
ハ、ハードルが高い。
はじめて、\b使ったよ。。。

for (int i = 0; i < number; i++) {
    System.out.print(paramNames[i] + " ___ cm:\b\b\b\b\b\b\b");
    try {
        params[i] = Double.parseDouble(br.readLine());
        //System.out.println("cm");
    } catch (NumberFormatException e) {
        System.out.println("数値を入力してください");
        i--;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 16:45

    多分「底辺」と「cm」の間に空白があって、そこに入力させるという想定では?>最初からcm表示

    キャンセル

  • 2017/07/05 17:04

    その形が理想ですが、momon-gaさんの表記でも見やすく良いと思いました。
    ありがとうございます。

    キャンセル

  • 2017/07/05 17:50

    コンソール実行なら、\bで、いい線いきましたが、IDEだとダメですね・・・

    キャンセル

同じタグがついた質問を見る

  • Java

    15776questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。