C++で、配列の要素の表示の後に、cinでinputしたいのですが、プログラムを実行すると、先に表示されるべき、配列の要素の上に、cinのinputが重なります。
実現したい結果は、
adjective: ここに(input)
C++
1 2string* makeList(int size){ 3 string* listy=new string[size]; 4 return list; 5} 6 7 8getline(ifs,str); 9int size=stoi(str); 10 11string* list=makeList(size); 12 13for(int i=0;i<size;i++){ 14 getline(ifs,word); 15 list[i]=word; 16} 17 18for(int i=0;i<size;i++){ 19 cout<<list[i]<<": "; 20 cin>>name; 21}
このコード以前にも、getline(cin,variable)や、cinを使っていたので、
cin.ignore()などを試しましたが結果は変わりませんでした。
アドバイスいただきたいです。よろしくお願いします。
cout<<list[i]<<": " << flush; だとどうなります?
試してみます。
同じ結果となりました。
cout や、cinのストリームにゴミのような物が残ってこんなことになってるのでしょうか?
list[i]の内容に\r(0x0d)が含まれていませんか?
listの中身は、
このような物なのですが、この質問にあげたコードの前に、先に1行目の 5を取得するために、
getline(ifs,length);
をしています。
//中身
5
adjective
noun
plural noun
adverb
実行環境はどのようなものでしょうか。
LinuxなどにSSHログインしていて、端末の改行コード(\r/\r\n/\nの扱い)が適切でない、なんていう印象を持ったのですが。
#include <cstdio>
int main(){
printf("hello\nworld.\n");
return 0;
}
ではどういう表示が得られますか?
hello
world.
このように表示されました。
macOS Catalina
version 10.15.3
MacBook Pro(Retina, 13-inch, Early 2015)です。
cout<<"CHOOSE a-z: ";
cin>>choice;
では、しっかりと意図通りに
CHOOSE a-z: (input)
のように表示されたので、やはり動的で作成した配列が問題でしょうか?
質問文の中のコードの範囲を広げて再投稿しました。
では、"adjective"を表示するコードの部分を示して下さい。
わかりました。さらに追加します。
表示そのものは既にでていますね。失礼しました。
"adjective"をlistに設定する部分はどうなっていますか。
("e"のあとに余計な文字が紛れ込んでいることを疑っています)
質問を整理し終えました。
//オープンしてるファイルの中身
5
adjective
noun
plural noun
adverb
pronoun
最近のMacの振る舞いを知らないのですが、
そのgetlineで取得しているファイルがWindowsで作成されたもので、改行コードが\x0d\x0aになっていて、Macと異なるので悪さをしている...なんてことはないでしょうか。
UNIX系OSでは改行コードはLF(\n,0x0A)です。
入力ファイルの改行コードがCR(\r,0x0D)LF(\n,0x0A)の場合、読み取られたバッファにCR(\r,0x0D)も入り、行頭に戻っているのだと思います。
cout<<"1\n";
cout<<"2\r";
cout<<"3\n";
のようにすると”2"の上に"3"が上書きされます。
多分そうです。このファイルはwindowで作られてます。
macユーザーは、自分でファイルを作成してと言われたので、
コピペして、ファイルを作ったのですが、
手打ちで打ち込んでみます。
手打ちするとかの問題ではありませんでした。ファイルを自分で作成したところ問題が解決いました。ありがとうございました。皆さんお世話になりました。
解決したスクショをあげときます。
回答1件
あなたの回答
tips
プレビュー