要素にすでに格納されている値をキーボードからの入力で上書きすると、文字列型の配列がデータを取得しないのはなぜですか?

サンカルプ

「01」や「10」などの値を配列に格納しようとしていますが、int配列は「01」を「1」として受け取ります。したがって、文字列配列を使用することにしました。文字列配列を宣言するときに、次のように初期化しました。

string array[n] = {0};

コードをコンパイルすると、次のようなエラーが表示されます。

"terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_M_constructnull not valid"

配列の型を整数に変更するだけで、問題なく動作します。

私は初期化しないようにしました

string array[n]={0};

その後、コードは正常に機能します。

文字列型の配列は、要素にすでに格納されている値を上書きできないと結論付けることができますか?

#include<bits/stdc++.h>

using namespace std;
int main(){
    int n;
    cin>>n;
    string arr[n] = {0};
    for(int i=0; i<n; i++){
    cin>>arr[i];
    cout<<arr[i];

    }  
 }

これはコードの出力です:

1
terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_M_constructnull not valid
NathanOliver

あなたは2つの問題を抱えています

string arr[n] = {0};

まず、nはコンパイル時定数はないためarr、VLA(可変長配列)になります。これらは標準ではなく、一部のコンパイラによって拡張機能としてのみサポートされています。-pedanticコンパイラフラグを使用して、コンパイルを停止することができます

次に、= {0}パーツは配列の最初の文字列を整数で初期化します00はヌルポインタ値でもあるため、ポインタとして扱われ、コンパイラはヌルポインタから文字列を作成しようとします。これは未定義の動作であり、この場合std::stringは例外をスローします。

これらすべてを修正するには、std::vector(ランタイムサイズを持つことができる)を使用し、デフォルトですべての要素を作成します。あなたはそのようにすることができます

std::vector<std::string> arr(n);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ