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

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

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

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

1回答

758閲覧

c++のstringにおける文字列の代入の扱い方がわかりません。

TR10

総合スコア1

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2023/03/26 02:27

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • string で変数に代入した大文字の文字列を出力したい。

前提

ここに質問の内容を詳しく書いてください.
・文字列を大文字にして出力しようと思って試したところ{stringで変数に空文字のままで、ある文字列の大文字をfor文を用いて、代入したとき}・・・(1)と、{最初に変数に大文字にする前のある文字列を代入したあとに、その文字列の大文字をfor文を用いて、代入したとき}・・・(2)の2通りで出力される文字列が両方とも同じ大文字の文字列になると思ったところ異なり、なぜ異なるのかがわかりません。配列の番号を直接指定した際には(1)と(2)の両方とも同じ大文字の文字列が出力されるのですが、配列の番号を指定をしないと同じ文字列をfor文を用いて、代入したにも関わらず、(1)では空文字もままで(2)では目的の文字列の大文字が出力されています。原因は最初に文字列を代入するかどうかだと思ったのですが、なぜ最初に文字列を代入をするか、文字列の配列の番号を直接指定しなければ、大文字の文字列が出力されないのかがわかりません。
よろしくお願いいたします。

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

エラーメッセージ

該当のソースコード

#include <iostream> #include<string> using namespace std; int main(){ //tが空文字のとき・・・(1) string t,s="string"; for(int i=0;i<s.size();i++){ t[i]=toupper(s[i]); } cout<<t<<endl; for(int i=0;i<6;i++){ cout<<t[i]; } cout<<endl; //ここから同じ処理で //最初にuにも”string"を代入したとき・・・(2) string u,v="string"; u=v; for(int i=0;i<v.size();i++){ u[i]=toupper(v[i]); } cout<<u<<endl; for(int i=0;i<6;i++){ cout<<u[i]; } return 0; }

試したこと

当該のソースコードにあるようにstringの文字列を空文字のままと、ある文字列を代入した時とを比較した。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1 //tが空文字のとき・・・(1) 2 string t,s="string"; 3 4 for(int i=0;i<s.size();i++){ 5 t[i]=toupper(s[i]); // tが空文字ならt[i]は存在しない。存在しないところに代入はできない。 6 // 正しくは t.push_back(toupper(s[i])); あるいは t += toupper(s[i]); 7 }

投稿2023/03/26 03:51

episteme

総合スコア16614

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

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

TR10

2023/03/26 13:46

空文字には代入はできないのですね、回答ありがとうございます。 追加でお聞きしたいのですが、空文字に代入ができないのであれば、(1)の2つ目の出力の際に、直接に配列の番号を指定してfor文を用いて出力すると、tは空文字ではなく、大文字の文字列がなぜ出力されるのですか?空文字に代入ができないのであれば、代入ができずに出力の2行目も、tは空文字で出力されるのではないかと思うのですが…
episteme

2023/03/26 14:28

for ( ... ) { t[i] = toupper(s[i]); } の直後 t.size() はいくつになっていますか? 文字列の長さ(ここではt.size())を超える位置のアクセスの結果は未定義です。
TR10

2023/03/27 01:50

何度もありがとうございます。番号を指定せずに、tのみで(cout<<t;)のように出力をしようとすると、t全体を出力することになるが、配列の番号が0~5番目が定義されていたとしても、6番目以降が未定義だから、0~5番目の文字も出力されずに2行目のtは空文字で出力されるという認識であってますか?
episteme

2023/03/27 01:52

ごめん何言うてるかわかんない。
TR10

2023/03/27 08:30

改めてみると説明不足の箇所がありました。すみません。 2行目の出力の時点で、tの配列の番号が0~5番目は定義されていた。(具体的には”STRING") そしてそれ以降のアクセス結果は未定義(6番目以降)の状態と回答をいただいたと認識しています。 ここからが1つ前に質問した内容で、この時点で上のソースコードに追加で(cout<<t;)と出力をしてみました。{もし0~5番目が定義されているのなら、cout<<t;で”STRING"と表示されると考えたので) ただ結果は空文字が出力されました。 そこでお聞きしたかったのは(1)のコードの最後にcout<<t;と加えたとき、2行目で”STRING"と出力されたにも関わらず、なぜtは”STRING”ではなく、空文字が出力されるのかということです。
fana

2023/03/27 10:01

https://cpprefjp.github.io/reference/string/basic_string/op_at.html t が空(サイズ0)な状態において t[0] を書き換えたり, t[1] とか t[2] にアクセスしている時点で未定義動作,ってだけの話. 「2行目の出力がどうの」とかいう,それ以降(未定義動作になるようなことをやっちゃった後)の現象について言及してても意味ないのでは.
TR10

2023/03/27 11:40

そのお話を聞いて、未定義動作の説明を見てようやく疑問が解消しました。未定義動作というものの存在を知らなかったのが原因でした。お二方とも回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問