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

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

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

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

Q&A

解決済

3回答

753閲覧

【修正】Sringの一文字目が’A'かどうかの処理をお伺いしてよろしいでしょうか?

ma2hiro

総合スコア157

C++

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

0グッド

0クリップ

投稿2022/08/25 00:48

編集2022/08/25 02:54

前提

C++を思い出すために勉強しております。

実現したいこと

Stringの一文字目がAだったらの処理を思い出したい

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

class cCust2 { public: string sOrder[20]; }; int main__() { cCust2 customer[100]; strcpy((char*)customer[0].sOrder, "ABC"); // customer[0].sOrder[0] = "ABC"; if (customer[0].sOrder[0].compare('A')) { cout << "OK" << endl; } }

と実装したが

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0304 オーバーロードされた関数 "std::basic_string<_Elem, _Traits, _Alloc>::compare [代入_Elem=char, _Traits=std::char_traits<char>, _Alloc=std::allocator<char>]" のインスタンスが引数リストと一致しません ConsoleApplication2

上記 関数の使用方法が違うのか
関数が違うのかお伺いしてよろしいでしょうか?

初心者の質問大変申し訳無いのですが上記お問い合わせいたします。

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

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

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

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

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

dodox86

2022/08/25 01:19

> Stringの一文字目がAだったらの処理を思い出したい リファレンスやそれに付随するサンプルコードを確認されないのでしょうか。思い出そうとするたびに引っ掛かって質問するのでは効率が悪すぎませんか。
ma2hiro

2022/08/25 01:35

dodox86様 仰る通りなので 調査方法をお伺いしたいのです…… 言葉足らずで申し訳ないです…… 例えば今回の例では string 文字列 比較 サンプルコード でグーグル先生に問い合わせてみてもなんか良い結果がヒットしなかったのです…… 「なんとググれば良いでしょうか?」と書こうかと思ったのですが 私が余りにも勉強不足なためうまく引っ張れないかと恐れているのです…… もう少しバンバン検索して探してみます…… 以上ご連絡いたします。
dodox86

2022/08/25 01:55

> 調査方法をお伺いしたいのです…… とありますが、質問の文中には「関数の使用方法が違うのか関数が違うのかお伺いしてよろしいでしょうか?」とあり、調査方法についての質問とは読み取れません。先のいくつかのご質問でもいくつか指摘があったと思いますが、なんとなくバンバンと検索しても不要な記事がひっかかるだけです。
int32_t

2022/08/25 01:56

ぐぐるんじゃなくて、リファレンスを見るべきです。C++の書籍なら std::string のメソッド一覧ぐらい載っているのではないですか。最近では cpprefjp がかなり有用です。 https://cpprefjp.github.io/reference/string/basic_string.html この質問の場合、コンパイルエラーが出ているのですから、「operator[] の返り値の型はなんだっけ」とリファレンスを確認するのが妥当でしょう。 https://cpprefjp.github.io/reference/string/basic_string/op_at.html
ma2hiro

2022/08/25 02:24

int32_t様 ありがとうございます。 そちらのリファレンスを拝見させて頂きます。 ググるのでは無いのですね…… 助かりました。 ありがとうございます。
thkana

2022/08/25 12:01

「思い出したい」のであって「正答を知りたい」ではないのですね。 しかし、やりとりを見ていると「かつては理解していた」ようにも思えないのですが、どうでしょう。
ma2hiro

2022/08/29 00:35

thkana様 もう10年以上前なのでもうほとんど記憶が曖昧なのです…… コメントありがとうございました。
guest

回答3

0

なんかいろいろとおかしい…
そもそもプログラミングって「こう書けばこう動く」ではありません。
つまり丸暗記するのではありませんよ。
ロジック、つまり『論理』という整合性を保ちながら命令していくことです。
料理のレシピとか手順書みたいなものです。

元のコードが、

C++

1class cCust2 { 2public: 3 string sOrder[20]; 4}; 5 6int main__() { 7 cCust2 customer[100]; 8 9 strcpy((char*)customer[0].sOrder, "ABC"); 10// customer[0].sOrder[0] = "ABC"; 11 if (customer[0].sOrder[0].compare('A')) { 12 cout << "OK" << endl; 13 } 14}

らしいですね。でもこの cCust2::sOrder はどういうものでしょうか。
string sOrder[20]と書くと、「要素数20のstring型の配列」ですよ。C言語風に言えば「二次元配列」に近いでしょうね。でもmain関数内での使い方を見ると「要素数20のchar型配列」的な使い方をしているようです。
それならいっそchar sOrder[20]としたほうが早いです。
stringはchar型配列(厳密にはchar型の動的配列?)をテンプレートクラスとして包んでいるだけだと思います。
一次元配列と二次元配列は別物です。

次にif (customer[0].sOrder[0].compare('A'))の行ですが、これは「str[0][0]の値が'A'であれば」的な意味ですよね?(厳密にはちょっと違いますがイメージ的に)

そしてここでエラーが出ると。
エラーメッセージぐらい読みましょう。

エラーメッセージ:

error

1重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 2エラー (アクティブ) E0304 オーバーロードされた関数 "std::basic_string<_Elem, _Traits, _Alloc>::compare [代入_Elem=char, _Traits=std::char_traits<char>, _Alloc=std::allocator<char>]" のインスタンスが引数リストと一致しません ConsoleApplication2

ですけど、よく読んでください。
オーバーロードされた関数 "std::basic_string<_Elem, _Traits, _Alloc>::compare ... のインスタンスが引数リストと一致しません」という部分。これは「std::basic_string<>のcompareメンバ関数に渡されている引数なんかがおかしい」場合に出ます。その場合は修正依頼のコメント欄でも紹介されているようなリファレンスとかを引いて「std::basic_string<>::compare」を調べる。
そうすると、ここだと、
int compare(const basic_string& str) const noexcept;とある。
引数は「const付きのbasic_stringの参照で引き受ける」。戻り値はint型だとわかる。(ちなみに例外は飛んでこない)

const付きっていうのは引数だと「関数内ではデータの値を変更しない」という保証のようなものですね。
basic_stringはstd::stringとかのこと。(std::stringは、本来はbasic_stringのテンプレートにchar型を渡したもの、つまりchar型配列としてのものだと明示しているだけ)

char型配列とchar型変数は別物。よって今回は「文字列を渡すべき」ですね。
でもコードでは.compare('A')という風に「文字」として渡している。
文字と文字列は別物です。

これを文字列として渡したとしても結果がおかしいことになるかと思います。
(結果は多分質問者さんが想定した答えになるだろうけど、意味的にはまったくの別物)

だって、cCust2::sOrder は 「stringの配列」です。stringは配列を包んだものなので二次元配列に近い。
図にしてみるとわかりやすいと思います。

0 | 1 | 2 | 3 | ... abc | ??? | ??? | ??? | ... ??? | ??? | ??? | ??? | ...

のような感じになっていますね。(だってstringの配列だから)

そうすると、「"ABC" == "A"」が満たしていないとおかしいですよね。でもこれ、満たしていますか?
ちゃんと先ほどのcompareメンバ関数の定義を確認してください。
「compareの戻り値はint型」ですよね。
で、先ほどのページにも戻り値の項目のところで『(1) 比較結果が非0を返した場合は、比較結果をそのまま返す。そうでなければ、以下の条件に従って戻り値を返す』とあります。その下にある表を見ると「同じなら0を返す」。なので if文での条件式を == 0としてみましょう。
つまりif( customer[0].sOrder[0].compare("A") == 0 )としてみましょう。

すると、何も表示されませんよね。(エラーメッセージが出てこない場合)
つまり同じ値ではないということ。

投稿2022/08/25 04:20

BeatStar

総合スコア4958

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

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

ma2hiro

2022/08/29 00:32 編集

すごくわかりやすい解説ありがとうございました。 すっきりしました。 本当にありがとうございます。 String.Compare("文字列") で出来ましたっ
guest

0

ベストアンサー

C++

1#include <iostream> 2#include <string> 3 4class cCust2 { 5public: 6 std::string sOrder[20]; 7}; 8 9int main() { 10 cCust2 customer[100]; 11 customer[0].sOrder[0] = "ABC"; 12 13 if ( customer[0].sOrder[0][0] == 'A' ) { 14 std::cout << "OK" << std::endl; 15 } 16}

投稿2022/08/25 03:35

episteme

総合スコア16614

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

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

ma2hiro

2022/08/25 04:26

ありがとうございます。 結局 =='A' で出来るのですねっ なんかドツボにハマっていて失礼致しました。
guest

0

C++

1#include <iostream> 2#include <string> 3#include <vector> 4 5using namespace std; 6int main() { 7 string sTest="ABC"; 8 9 if (sTest[0]=='A') { 10 cout << "OK" << endl; 11 } 12}

投稿2022/08/25 00:51

ozwk

総合スコア13528

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

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

ma2hiro

2022/08/25 02:20

ありがとうございます。 実際には string sTest="ABC"; ではなくて class cCust2 { public: string sOrder[20]; }; int main__() { cCust2 customer[100]; strcpy((char*)customer[0].sOrder, "ABC"); // customer[0].sOrder = "ABC"; if (customer[0].sOrder[0].compare('A')) { cout << "OK" << endl; } } なのです…… 失礼致しました。質問を編集します……
ozwk

2022/08/25 02:29

sOrderはstring[20] (= stringの配列)ですが strcpy((char*)customer[0].sOrder, "ABC"); から察するにsOrderはstringであることを期待しているようにも見えます どっちですか?
ma2hiro

2022/08/25 02:58

ozwk様 失礼致しました。 strcpy((char*)customer[0].sOrder[0], "ABC"); です。 元の方も修正しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問