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

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

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

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

C++

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

Q&A

解決済

2回答

534閲覧

C++にてdo whileのループから抜け出せない

motch_misa_ore

総合スコア15

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

C++

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

0グッド

0クリップ

投稿2022/12/23 10:29

質問概要

数字以外を入力されたときにエラーとし、入力しなおしをするようdo whileを使用しているのですが、一度数字以外の文字を入力すると無限ループに陥ってしまいます。

実現したいこと

N*Nの正方行列の各要素を手入力してもらい、数値以外の文字を入力されたときにその要素の再入力をする仕様にしたいと思っています。

Terminal画面の表示

PS C:\Users\motch\java> g++ Loop1_C++_20221222.cpp -o Loop1_C++_20221222 ; .\Loop1_C++_20221222 Input some real numbers How many rows and columns does the matrix have?3 x? x[0][0]?----------->1 x[0][1]?----------->2 x[0][2]?----------->3 x[1][0]?----------->4 x[1][1]?----------->o Input only number! x[1][1]?----------->Input only number! x[1][1]?----------->Input only number! x[1][1]?----------->Input only number! x[1][1]?----------->Input only number! x[1][1]?----------->Input only number!

該当のソースコード

C++

1 cout << "x?" << endl; 2 for(i=0;i<N;i++){ 3 for(j=0;j<N;j++){ 4 do{ 5 cout << "x["<< i <<"]["<< j <<"]?----------->"; 6 cin >> x[i][j]; 7 if(cin.fail()!=0) 8 { 9 cout << "Input only number!" << endl; 10 x[i][j]=0; 11 } 12 else break; 13 }while(1); 14 15 } 16 } 17 cout << endl;

試したこと

Input only number!と表示した後、間違い入力をした要素(上記ではx[1][1])へ0を代入しなおしたのですが意味がないようです。手がかりを教えていただきたいです。

以上よろしくお願いいたします。

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

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

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

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

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

motch_misa_ore

2022/12/23 11:14

おおむね一番の障害はある程度解消したので、次の障害(?)は独立した新たな質問として再度上げました。
guest

回答2

0

ベストアンサー

ストリームは対話的なデバイスに接続されているとは限りません。 ファイルかもしれないので一行づつではなく事前に全ての値が用意されているかもしれないのです。

たとえば三個の数値が必要な箇所で一か所がうっかり数値ではないものが入力されたとします。

123 abc 456

数値として読みとれないものを読み飛ばしてしまうと三個目の値として入力したつもりの値が二個目として読まれることになって連鎖的に想定と違う入力になるということが起こります。 この状況からどう回復すべきなのかというのは状況によるのでストリームの側で勝手なことをしないようにライブラリは設計されているのだと思います。

今回の質問の例だと入力は対話的なデバイスであるという仮定を持っていますので最も簡単な方法は「次の改行まで読んで捨てる」でしょう。 ちなみにストリームの状態ビットは陽にクリアする (メンバ関数 clear を呼ぶ) 必要があるので気を付けてください。

投稿2022/12/23 11:54

SaitoAtsushi

総合スコア5444

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

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

motch_misa_ore

2022/12/23 11:56

ありがとうございました。そもそもこのアイデア自体に無理があったようですね。
guest

0

こういうのは入力に失敗したら、失敗した文字/文字列は読み出されません。
なので、いつまで経っても不正文字(?)が残って、それを読もうとしているため、終わりません

投稿2022/12/23 11:12

y_waiwai

総合スコア87749

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

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

motch_misa_ore

2022/12/23 11:15

先ほどに引き続きありがとうございます。うーむどうすればいいのやら… どうすればリセットできるのでしょうか?
y_waiwai

2022/12/23 11:56

入力は一旦文字列で受け取って、その文字列をチェックするようにしましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問