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

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

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

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

C++

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

Q&A

解決済

3回答

6403閲覧

C++のstringのコンストラクタの使い方

chijan

総合スコア24

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

C++

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

0グッド

0クリップ

投稿2015/09/29 06:19

編集2015/09/29 06:47

C++のstringコンストラクタを
http://www.cppll.jp/cppreference/cppstring_details.html#Constructors
を見ながら使おうとしてよくわからないことになりました。

C++

1FILE * stream 2char * hoge; 3std::string str 4 5fgets(hoge,BUFF,stream); 6str=str(hoge);

とすると、
‘(std::string {aka std::basic_string<char>}) (char*&)’ への呼び出しが適合しない
というエラーが出てしまいます。

引数が"fugafuga"っていう直接入力じゃないとダメなのでしょうか?
もしそうであれば、char * 型変数をstringにするにはどうすればいいのでしょうか?

当方の環境は、Cygwinで g++ -std=gnu++14でコンパイルしています。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

最後の行

c++

1str = std::string(hoge);

ではないでしょうか。

投稿2015/09/29 06:29

osmoc-1970

総合スコア124

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

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

chijan

2015/09/29 06:51

ご回答ありがとうございます。 syntaxエラーを指摘されるエラーがでなくて気づきませんでした。以後気をつけます。
guest

0

ベストアンサー

std::stringコンストラクタの正しい使い方は、moscmoc-1970さん回答の通りです。他にもstd::string型変数へC文字列(char*型)を代入する方法はいろいろあります。

c++

1str = std::string(hoge); 2// または 3str = hoge; 4// または 5str.assign(hoge);

このコードでは、その前の「ストリームから文字列を読み込む処理」に大きな問題があります。下記引用コードは、どう頑張っても正常に動作しません。(たまたま動いたように見える可能性はありますが、大抵はプログラムクラッシュすると思います)

C++

1char * hoge; 2fgets(hoge,BUFF,stream);

変数streamの型が明示されていないため推測となりますが、もしFILE*型ならば変数hogeを配列型char hoge[BUFF];として宣言する必要があります。<del>そうではなくC++のstd::istream系列であれば、根本的な誤りがあります。</del>


おまけ:簡単ですがエラーメッセージの解説・理由も付けておきます。

str=str(hoge); とすると
‘(std::string {aka std::basic_string<char>}) (char*&)’ への呼び出しが適合しない

誤って書いたstr=str(hoge);では、まず=の右辺str(hoge)が評価されます。C++言語の文法ではこの右辺を「変数strを関数オブジェクトとみなし、その引数にhogeを渡して呼び出す」部分式と解釈します。しかし実際には、変数strは関数オブジェクトでは無くstd::string型、正式名はstd::basic_string<char>型です。エラーメッセージの「呼び出しが適合しない」というのは、このような原因で出力されています。

投稿2015/09/29 06:41

編集2015/09/29 07:15
yohhoy

総合スコア6191

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

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

chijan

2015/09/29 06:55

ご回答ありがとうございます。 ほかの方法もあったのですね、勉強になります。 ご推察のとおり、FILE*です。fgetsの3つ目の引数なのでいいだろうと思って略しましたごめんなさい。
chijan

2015/09/29 07:28

おまけについて。 なるほどです、解読はできる書き方だったためにsyntaxを突かれるエラーは出ず、呼び出しが適合しないということになったのですか……。
guest

0

あらかじめstrを用意するのではなく

C++

1fgets(hoge,BUFF,stream); 2std::string str(hoge);

で解決しました。お騒がせしました。

投稿2015/09/29 06:49

編集2015/09/29 06:50
chijan

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問