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

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

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

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

Q&A

解決済

3回答

8625閲覧

getlineがうまく動作しない

daiking

総合スコア19

C++

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

0グッド

0クリップ

投稿2020/02/09 02:45

現在c++で多重定義について勉強しています。挿入演算子と抽出演算子を多重定義しようとしています。挿入演算子はコードに書いてある通りignoreで邪魔な文字を無視してgetlineでメンバ変数に文字を代入しようとしています。
しかし、これを実行すると最初の変数areaCodeには代入されるのですがそのあとの変数には代入されません。環境はVSの最新版です。
デバックで見たのですがのexchangeとlineには'\0'とフという文字が入っていました。
これをうまく操作させるにはどのようにすればよいのでしょうか。

また、このコードはある参考書のサンプルコードになります。

c++

1 2#include <iostream> 3#include < string > 4using namespace std; 5 6 7class PhoneNum { 8 friend ostream& operator<<(ostream&, const PhoneNum&); 9 friend istream& operator>>(istream &, PhoneNum&); 10private: 11 char areaCode[4]; 12 char exchage[4]; 13 char line[5]; 14}; 15 16ostream& operator<<(ostream& output, const PhoneNum& num) 17{ 18 output << "(" << num.areaCode << ") " 19 << num.exchage << "-" << num.line; 20 21 return output; 22} 23 24istream& operator>>(istream &input, PhoneNum &num) 25{ 26 input.ignore(); 27 28 input.getline(num.areaCode, 4); 29 input.ignore(2); 30 input.getline(num.exchage, 4); 31 input.ignore(); 32 input.getline(num.line, 5); 33 34 return input; 35} 36 37int main() { 38 PhoneNum phone; 39 40 cout << "(123) 456-7890形式で電話番号を" 41 << "入力してください:\n"; 42 43 cin >> phone; 44 cout << "入力された電話番号は: \n" 45 << phone << '\n'; 46 return 0; 47 48} 49

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

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

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

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

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

guest

回答3

0

ベストアンサー

getline はデリミタを指定しないと '\n' まで読み込もうとします。
読み込み先の領域が小さすぎると failbit が立ってエラーとなり、
それ以降の読み込みはできません。

お勧めはしませんが、次のようにすると読み込めます。

C++

1istream& operator>>(istream &input, PhoneNum &num) 2{ 3 input.ignore(); // skip '(' 4 input.getline(num.areaCode, 4, ')'); 5 input.ignore(); // skip ' ' 6 input.getline(num.exchage, 4, '-'); 7 input.getline(num.line, 5); 8 return input; 9}

投稿2020/02/09 04:21

kazuma-s

総合スコア8224

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

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

daiking

2020/02/09 04:35

こんにちは。回答ありがとうございます。 上のコードで実際に動きました。ありがとうございます。
guest

0

こんにちは。

istream::getlineはバッファサイズを超えた場合はfailとなるようです。バッファオーバーフローだろうと思います。
エラーをリセットしないと継続読み込みに失敗します。
input.getline(...);の後でinput.clear();することで読めるとは思います。

しかし、積極的にバッファオーバーフロー判定を使うのはあまり好ましくない使い方のように感じます。
一度std::stringへ1行読み出してから解析するとスマートに書けることが多いです。

投稿2020/02/09 03:18

Chironian

総合スコア23272

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

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

daiking

2020/02/09 04:36

こんにちは。オーバーフローではなくデリミタを指定していなかったことが原因だとわかりました。ありがとうございました。
guest

0

僕ならこう↓書く

C++

1#include <iostream> 2#include <sstream> 3#include <string> 4#include <algorithm> 5 6class PhoneNum { 7 friend std::ostream& operator<<(std::ostream&, const PhoneNum&); 8 friend std::istream& operator>>(std::istream &, PhoneNum&); 9private: 10 char areaCode[4]; 11 char exchage[4]; 12 char line[5]; 13}; 14 15std::ostream& operator<<(std::ostream& output, const PhoneNum& num) { 16 output << "(" << num.areaCode << ") " 17 << num.exchage << "-" << num.line; 18 return output; 19} 20 21std::istream& operator>>(std::istream &input, PhoneNum &num) { 22 std::string inputline; 23 // 一行読みこんで 24 std::getline(input, inputline); 25 // '0'~'9' 以外を' 'に置き換えて 26 std::replace_if(inputline.begin(), inputline.end(), 27 [](char ch) { return ch < '0' || ch > '9'; }, 28 ' '); 29 // areaCode, exchange, line を抽出する 30 std::istringstream(inputline) 31 >> num.areaCode 32 >> num.exchage 33 >> num.line; 34 35 return input; 36} 37 38int main() { 39 PhoneNum phone; 40 41 std::cout << "(123) 456-7890形式で電話番号を" 42 << "入力してください:\n"; 43 44 std::cin >> phone; 45 std::cout << "入力された電話番号は: \n" 46 << phone << '\n'; 47 return 0; 48}

投稿2020/02/09 03:05

episteme

総合スコア16612

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

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

daiking

2020/02/09 04:37

回答ありがとうございます。replace_ifは使ったことがないので調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問