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

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

ただいまの
回答率

91.03%

  • C++

    2927questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

競技プログラミングでstd::cinでの入力待ちが終わらない

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 296

ganariya2525

score 16

前提・実現したいこと

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_8_B&lang=jp
のサイトの、2分探索木の問題について、std::cinでの入力に関して質問があります。

発生している問題・エラーメッセージ

上記サイトの「入力例1」を実行すると、最終行の「print」をstd::cinで読み込むと、永遠と入力待ちになってしまいます。

該当のソースコード

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <vector>

using namespace std;

struct Node {
    int key;
    Node* parent;
    Node* left;
    Node* right;
};

Node* root=nullptr;

void firstPrint(Node *node) {
    if (node == nullptr) {
    return;
    }
    printf(" %d", node->key);
    firstPrint(node->left);
    firstPrint(node->right);
}

void middlePrint(Node *node) {
    if (node == nullptr) {
    return;
    }
    middlePrint(node->left);
    printf(" %d", node->key);
    middlePrint(node->right);
}

void insert(int key) {
    Node* node = (Node*)calloc(1, sizeof(Node));
    node->key = key;
    if (root == nullptr) {
    root = node;
    node->parent = nullptr;
    return;
    }

    Node* p = root;
    Node* parent=p->parent;
    while (p !=nullptr) {
    if (p->key < key) {
        parent = p;
        p = p->right;
    }
    else if (p->key > key) {
        parent = p;
        p = p->left;
    }
    else {
        return;
    }
    }

    node->parent = parent;

    if (parent->key < key) {
    parent->right = node;
    }
    else if (parent->key > key) {
    parent->left = node;
    }

}

bool find(int key) {
    bool isFind = false;
    Node* p = root;
    while (p != nullptr) {
    if (p->key == key) {
        isFind = true;
        break;
    }
    else if (p->key > key) {
        p = p->left;
    }
    else {
        p = p->right;
    }
    }

    return isFind;

}

void print(Node *node) {
    middlePrint(node); printf("\n");
    firstPrint(node); printf("\n");
}


int main() {

    cin.tie(0);
    ios::sync_with_stdio(false);

    int m; scanf("%d", &m);
    string str;
    for (int i = 0; i < m; i++) {
    cin >> str;

    //insert
    if (str =="insert") {
        int key; scanf("%d", &key);
        insert(key);
    }
    //find
    else if (str[0] == 'f') {
        int key; scanf("%d", &key);
        if (find(key)) {
        printf("yes\n");
        }
        else {
        printf("no\n");
        }
    }
    //print
    else {
        print(root);
        }
    }

    return 0;

}

試したこと

VisualStudioのデバッガを使用して色々と調べたのですが最終行の「print」を読み込んだときのみ、cin関数で処理が止まってしまいました。

また、コピペで入力例を入力するのではなく、自分で入力例を入力するとちゃんと動作しました。

なぜ自分で打ち込めば動き、コピペで入力すると動かないのかがよくわかりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

言語:C++14
IDE:Visual Studio2015 Express

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

AOJでの入出力メモ C++によると、AOJで与えられる入力の末端は改行ではなくEOFの場合があるそうなのでif( cin>>hoge)while(cin>>hoge)のように入力結果を判定すべきです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/16 21:10

    if(cin>>str){}としてみたのですが、うまく動作しませんでした。何かIDEなどの環境が原因なのでしょうか。

    キャンセル

  • 2018/01/16 21:40

    解決いたしました!
    ありがとうございました!

    キャンセル

0

最後の改行を入力してなかったのでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

std::cin.tie(0);
std::ios::sync_with_stdio(false);

を記述すると、cinの使用の際に処理が早くなるが
AOJだと改行でinputが終了しないため、読込がされず永遠と読み込み待ちになる。

上記の2文のソースコードを削除すればうまく動作した。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • C++

    2927questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。