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

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

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

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

Q&A

解決済

3回答

590閲覧

C++:関数内で変数を操作し、メイン内に格納する方法

inle_rah

総合スコア11

C++

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

0グッド

0クリップ

投稿2022/08/02 01:08

前提

C++を独学している初学者です(タイトルが誤解を生むものだった場合はすみません)。
現在、「年月日(yyyymmdd)から月部分(mm)を取り出して表示する関数」というものを作成しています。
しかし”取り出した月部分(mm)を変数に格納”の部分が上手くいきません。

実現したいこと

  • 取り出した月部分(mm)を変数(mon)に格納出来る

発生している問題・エラーメッセージ

test.cpp: In function 'void getMonth(char&, char&)': test.cpp:14:12: error: cannot convert 'std::string' {aka 'std::__cxx11::basic_string<char>'} to 'char' in assignment 14 | cmon = str; | ^~~ | | | std::string {aka std::__cxx11::basic_string<char>}

該当のソースコード

C++

1/* ヘッダ */ 2#include <iostream> 3#include <string> 4 5/* getMonth関数 */ 6void getMonth (char &cymd, char &cmon) 7{ 8 std::string str = &cymd; 9 10 std::string substr = str.substr(4, 2); 11 12 std::cout << substr << std::endl; 13 14 cmon = substr; 15} 16 17/* メイン処理 */ 18int main () 19{ 20 char ymd[8+1] = "20220727"; 21 char mon[2+1] = ""; 22 23 std::cout << ymd << "\n"; 24 std::cout << mon << "\n"; 25 26 getMonth(*ymd, *mon); 27 28 std::cout << ymd << "\n"; 29 std::cout << mon << "\n"; 30 31 return 0; 32}

試したこと

・getMonth関数を個別の機能ごとに確認
⇒月部分の抽出は出来ている

・ポインタや変数などの変更

補足情報(FW/ツールのバージョンなど)

VScode(ver: 1.69.2)

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問のコードで 14行目は、cmon = substr; なのに、
エラーメッセージでは、14 | cmon = str; です。変ですね。

cmon の型は char で、substr の型は std::string です。
代入でそんな型変換はできません、とエラーメッセージは言っています。

cmon = sbustr; の行だけを変更するとすれば、

C++

1 const char *p = substr.c_str(); 2 std::copy(p, p + 3, &cmon);

getMonth関数の中身全部を変更するとすれば、

C++

1void getMonth(char &cymd, char &cmon) 2{ 3 char *p = &cymd, *q = &cmon; 4 q[0] = p[4]; 5 q[1] = p[5]; 6 q[2] = '\0'; 7 std::cout << q << "\n"; 8}

getMonth関数の引数の型を変更し、main からの呼出しも変更していいのなら、

C++

1#include <iostream> 2 3void getMonth(char *cymd, char *cmon) // ★ 4{ 5 cmon[0] = cymd[4]; 6 cmon[1] = cymd[5]; 7 cmon[2] = '\0'; 8 std::cout << cmon << "\n"; 9} 10 11int main() 12{ 13 char ymd[8+1] = "20220727"; 14 char mon[2+1] = ""; 15 16 std::cout << ymd << "\n"; 17 std::cout << mon << "\n"; 18 19 getMonth(ymd, mon); // ★ 20 21 std::cout << ymd << "\n"; 22 std::cout << mon << "\n"; 23 24 return 0; 25}

投稿2022/08/03 05:12

kazuma-s

総合スコア8224

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

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

inle_rah

2022/08/03 07:42

ありがとうございます。 段階的にどこが間違っていたのか、どう修正されれば良いのかが素人目にも分かりやすかったので ベストアンサーとさせて頂きました。
guest

0

僕ならこう書く:

C++

1#include <iostream> 2#include <string> 3 4std::string getMonth (const std::string& ymd) { 5 return ymd.substr(4, 2); 6} 7 8int main () { 9 const char* ymd = "20220727"; 10 std::string mon = "(empty)"; 11 12 std::cout << ymd << "\n"; 13 std::cout << mon << "\n"; 14 15 mon = getMonth(ymd); 16 17 std::cout << ymd << "\n"; 18 std::cout << mon << "\n"; 19 20}

投稿2022/08/03 04:01

episteme

総合スコア16614

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

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

0

エラーメッセージのとおりです。char &cmonに対してstd::string substrは代入が成立しません。

変にcharを混ぜず、全部std::stringで統一するのがやりやすいかと思います。

投稿2022/08/02 01:13

編集2022/08/02 01:16
maisumakun

総合スコア145184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問