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

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

ただいまの
回答率

90.76%

  • C++

    3257questions

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

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

解決済

回答 3

投稿

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

ganariya2525

score 23

前提・実現したいこと

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で質問しよう!

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

関連した質問

  • 受付中

    HTMLPARSER タグ取り出し C++

    HTMLページの<p><p></p></p>に囲まれた文字を取り出したいのですが、うまくできません。下記のプログラムを基に取り出せるプログラムを作りたいです。よろしくお願いします。

  • 受付中

    C言語 二分木を生成する

    scanfで <<-,1,->,2,<-,3,->> と入力して、それを二分木にする関数を作っているんですが、scanfで読み込むために宣言したcharの配列buffを解析する関数

  • 解決済

    c言語 2分木の探索

    前提・実現したいこと 関数int search_tree(int x, struct node *p)だけが空欄になっていて、これを埋めて2文木の中に入力した数字が含まれていれば

  • 解決済

    C言語の構造体で2分木を作るプログラムの実行時エラーの解決策を教えてください。

    初心者なので不備が多いかと思いますが、とりあえず動くようにしたいです。 自分でいろいろいじってみましたがどうしてもわかりません。 どこをどう直せばいいのかどなたかご教授お願い致

  • 受付中

    2分木のデータの追加

    前提・実現したいこと ■概要 0~n-1のn個のデータを、ツリー構造としてリスト化 (リスト化の方法) 操作: 0<=r<=1として、①②の場合分けによって右の子を見

  • 解決済

    何が間違ってるか分からない

    前提・実現したいこと AizuOnlineJudgeの問題に正解したい 発生している問題・エラーメッセージ どこが間違ってるか分かりません 該当のソースコード using

  • 解決済

    C言語のプログラム!

    C言語のプログラムで、以下のような結果を出力するコードを教えてください! <出力結果> 目的地:東京 ←コマンドプロンプトに東京と入力する 場所:東の方角←東京以外を入力すると

  • 解決済

    c++言語。英文(半角スペース区切り)を出現する順に出力せよ。

    おねがいします c++言語について red green blue blue green blueのような文字列が渡される。 単語、半角スペース、出現回数の順で1行に1単語で

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

  • C++

    3257questions

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