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

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

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

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

Q&A

解決済

2回答

5192閲覧

ポインタ渡しのstring型引数で文字列の部分的操作方法

Tteratail

総合スコア36

C++

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

0グッド

1クリップ

投稿2021/08/20 22:54

関数にポインタでstring型の引数を渡し、その引数の文字列を操作したいです。
例えば文字列の一部の文字を変更する、などです。
しかし下記のようなテストコードで試行錯誤してみましたが、ポインタでstring型の引数を渡した場合、その引数の文字列の一部を操作する方法が分かりませんでした。
ポインタ渡しなので間接参照演算子* を使って *(str[0]) のような文字列の部分的操作ができないかと思いましたが、以下のように「間接演算子はポインタのオペランドが必要」的なコンパイルエラーが出てしまいます。
コンパイルの環境は以下の通りです。
clang version 12.0.0
Target: x86_64-apple-darwin19.6.0
Thread model: posix

どうすればポインタ渡しのstring型引数の文字列の部分的操作ができるか教えていただけたらと思います。よろしくお願いします。

c++

1#include <iostream> 2 3using namespace std; 4 5void myFunc(string*, char*); 6 7int main(){ 8 9 char myChr[] = "Hello, world"; 10 string myStr = "Hello, world"; 11 12 cout << myChr[0] << endl; //outputs "H" 13 cout << myStr[0] << endl; //outputs "H" 14 15 myFunc(&myStr, myChr); 16 17 return 0; 18} 19 20void myFunc(string* str, char* chr){ 21 22 cout << chr[0] << endl; //outputs "H" 23 cout << str[0] << endl; //outputs "Hello, world" 24 cout << *str << endl; //outputs "Hello, world" 25 cout << *(str[0]) << endl; //error: indirection requires pointer operand ('std::string' (aka 'basic_string<char>') invalid) 26 27 return; 28}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ポインタで部分的操作をするなら、以下の通りです。

c++

1cout << (*str)[0] << endl;

まず(*str)によりstring型に変換した後、[0]で0番目の要素を取り出しています。

余談ですが、ポインタでなく参照で渡した方が、char*と同様に操作出来て分かりやすいと思います。

c++

1void myFunc(string&, char*); 2 3int main(){ 4 ... 5 6 myFunc(myStr, myChr); 7 8 return 0; 9} 10 11void myFunc(string& str, char* chr){ 12 13 cout << chr[0] << endl; //outputs "H" 14 cout << str[0] << endl; //outputs "H" 15 16 return; 17}

投稿2021/08/20 23:09

編集2021/08/20 23:16
actorbug

総合スコア2224

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

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

Tteratail

2021/08/21 14:11

間接演算子*の使い方に誤りがあったんですね。`(*str)`で`string*`型から`string`に変換して、添字で要素を取り出す、ですね。勉強になりました。また、今回のケースだとポインタより参照の方が`char*`と同様の操作で分かり易いことも理解しました。
guest

0

どうすればポインタ渡しのstring型引数の文字列の部分的操作ができるか

参照で受けるのがお手軽かしら:

C++

1#include <iostream> 2#include <string> 3 4void myFunc(std::string*, char*); 5 6int main(){ 7 using namespace std; 8 char myChr[] = "Hello, world"; 9 string myStr = "Hello, world"; 10 11 cout << "\nbefore:\n"; 12 cout << myChr << endl; 13 cout << myStr << endl; 14 15 myFunc(&myStr, myChr); 16 17 cout << "\nafter:\n"; 18 cout << myChr << endl; 19 cout << myStr << endl; 20} 21 22void myFunc(std::string* pstr, char* chr){ 23 std::string& str = *pstr; // 参照で受けてポインタを外す 24 str[0] = 'h'; 25 chr[0] = 'h'; 26}

投稿2021/08/20 23:40

episteme

総合スコア16614

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

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

Tteratail

2021/08/21 14:06

なるほど、ポインタを外したものを参照の変数に代入して操作するという方法があったんですね。勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問