「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
あなたは2つの問題を抱えています
string arr[n] = {0};
まず、n
はコンパイル時定数ではないためarr
、VLA(可変長配列)になります。これらは標準ではなく、一部のコンパイラによって拡張機能としてのみサポートされています。-pedantic
コンパイラフラグを使用して、コンパイルを停止することができます。
次に、= {0}
パーツは配列の最初の文字列を整数で初期化します0
。0
はヌルポインタ値でもあるため、ポインタとして扱われ、コンパイラはヌルポインタから文字列を作成しようとします。これは未定義の動作であり、この場合std::string
は例外をスローします。
これらすべてを修正するには、std::vector
(ランタイムサイズを持つことができる)を使用し、デフォルトですべての要素を作成します。あなたはそのようにすることができます
std::vector<std::string> arr(n);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加