最速怪談選手権

現在getlineを用いてプログラムを作成しようとしているのですが、例えば
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main(){
char buffer[81];
while(!cin.eof()){
cin.getline(buffer,sizeof(buffer));
cout << buffer << endl;
while((!cin.eof())&&cin.fail()){
cin.clear();
cin.ignore(80,'\n');
}
}
return 0;
}
というプログラムを作った場合、標準入力から各行を80文字だけ読み込み出力をするわけなんですが、
この80文字という文字制限をなくしたい場合どういった工夫をすればいいのでしょうか?

A 回答 (2件)

まず、どんな感じの工夫をしてみましたか?修正されたソースを提示してください。



基本はほとんど書いたままなのですが、もう少しだけ説明を追記しておきます。
# 工夫の仕方を質問されてるのに、ソースをそのまま載せるのは好ましくないと考えますのであえて載せません。ご了承ください。
# FAQに近いので、どうしてもということであればGoogleで"getline(cin, buffer)"と検索するだけでも色々説明が出てきますし。


> char buffer[81];
こうかいてしまうと、当然一度に読み込めるのはこの80文字以下になる。
80文字ずつの分割読み出しは面倒。
std::stringは文字列長が可変なので、まずbufferをcharにするのはやめて、std::stringにする。
> std::string buffer;

> cin.getline(buffer,sizeof(buffer));
ここでsizeof(buffer)とやっているが、これはcharの場合には81になり、制限になっている。
また、cin.getlineはstd::stringを取るようになってないので、これを使うと文字数制限が消えない。

で、getlineには、cin(が所属するstd::istream)のメンバとしてのstd::istream::getlineと、そうでないstd::getlineというものが用意されている。
今回、読み出し数制限を緩和するためにはstd::getlineを使うので、呼び出し方を変えなければならない。
> getline(cin, buffer);

ってことです。

ちなみに、この場合でもstd::string::max_size()以上の入力とかしようとすると標準例外が発生する可能性はありますが、
通常は数万とか数十万文字とか(コンパイラ次第)入りますので、
入門レベルではまだ気にする必要がないかもしれません。
# 実務なら例外対策は重要ですけれど。興味があればtryやcatchの仕方等を調べてみてください。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます。
工夫した点に関しては、初めNULLを使って何とかならないものかと色々やってみましたが、この説明を見て自分のやってる行為が恥ずかしくなってきました。
tryやcatchに関してもちょっと勉強して見たいと思います。
どうもありがとうございました。

お礼日時:2006/11/25 14:04

bufferをstd::stringに変えて、


getlineをメンバでないstd::getlineに変える。

std::string buffer;
getline(cin, buffer);

この回答への補足

回答ありがとうございます。
すみませんがもう少し詳しく書いてくれるとありがたいです。
上のプログラムも参考書片手に、見よう見まねで書いたものなので。
申し訳ないです。

補足日時:2006/11/24 15:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!