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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

3回答

8379閲覧

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

ganariya

総合スコア50

C++

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

0グッド

1クリップ

投稿2018/01/16 04:41

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

###発生している問題・エラーメッセージ
上記サイトの「入力例1」を実行すると、最終行の「print」をstd::cinで読み込むと、永遠と入力待ちになってしまいます。

###該当のソースコード

c++

1#define _CRT_SECURE_NO_WARNINGS 2#define _USE_MATH_DEFINES 3#include <iostream> 4#include <cstdlib> 5#include <string> 6#include <cstdio> 7#include <algorithm> 8#include <math.h> 9#include <vector> 10 11using namespace std; 12 13struct Node { 14 int key; 15 Node* parent; 16 Node* left; 17 Node* right; 18}; 19 20Node* root=nullptr; 21 22void firstPrint(Node *node) { 23 if (node == nullptr) { 24 return; 25 } 26 printf(" %d", node->key); 27 firstPrint(node->left); 28 firstPrint(node->right); 29} 30 31void middlePrint(Node *node) { 32 if (node == nullptr) { 33 return; 34 } 35 middlePrint(node->left); 36 printf(" %d", node->key); 37 middlePrint(node->right); 38} 39 40void insert(int key) { 41 Node* node = (Node*)calloc(1, sizeof(Node)); 42 node->key = key; 43 if (root == nullptr) { 44 root = node; 45 node->parent = nullptr; 46 return; 47 } 48 49 Node* p = root; 50 Node* parent=p->parent; 51 while (p !=nullptr) { 52 if (p->key < key) { 53 parent = p; 54 p = p->right; 55 } 56 else if (p->key > key) { 57 parent = p; 58 p = p->left; 59 } 60 else { 61 return; 62 } 63 } 64 65 node->parent = parent; 66 67 if (parent->key < key) { 68 parent->right = node; 69 } 70 else if (parent->key > key) { 71 parent->left = node; 72 } 73 74} 75 76bool find(int key) { 77 bool isFind = false; 78 Node* p = root; 79 while (p != nullptr) { 80 if (p->key == key) { 81 isFind = true; 82 break; 83 } 84 else if (p->key > key) { 85 p = p->left; 86 } 87 else { 88 p = p->right; 89 } 90 } 91 92 return isFind; 93 94} 95 96void print(Node *node) { 97 middlePrint(node); printf("\n"); 98 firstPrint(node); printf("\n"); 99} 100 101 102int main() { 103 104 cin.tie(0); 105 ios::sync_with_stdio(false); 106 107 int m; scanf("%d", &m); 108 string str; 109 for (int i = 0; i < m; i++) { 110 cin >> str; 111 112 //insert 113 if (str =="insert") { 114 int key; scanf("%d", &key); 115 insert(key); 116 } 117 //find 118 else if (str[0] == 'f') { 119 int key; scanf("%d", &key); 120 if (find(key)) { 121 printf("yes\n"); 122 } 123 else { 124 printf("no\n"); 125 } 126 } 127 //print 128 else { 129 print(root); 130 } 131 } 132 133 return 0; 134 135} 136 137

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

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

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

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C++14
IDE:Visual Studio2015 Express

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

投稿2018/01/16 05:04

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ganariya

2018/01/16 12:10

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

2018/01/16 12:40

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

0

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

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

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

投稿2018/01/16 12:41

ganariya

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/01/16 04:46

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問