-3

重複の可能性:
ヒープ上の非常に大きな配列(Visual C ++)

それぞれ長さが100000文字の10個の文字列を宣言する必要があります。

int main(void)
{
long t;
cin>>t;
string str[10][100000];
for(long i=0;i<=t;i++)
{
       getline(cin,str[i][100000]);
}

for(long i=1;i<=t;i++)
{
  getStringSize(str[i][100000]);
}
system("PAUSE");
}

私はVC++でコードを書きましたが、コードをコンパイルするとすぐにスタックオーバーフローが発生します。文字列のサイズをstr[10][10000]に保つと、コードはうまく機能します。コードを機能させるには何をする必要がありますか?

4

4 に答える 4

4

これは、それぞれ10,000文字の10個の文字列を宣言する方法ではありません。文字列の2D配列、10x10000を宣言しました。

各文字列に10,000文字を含める場合は、次のようにC++で実行します。

vector<string> str(10, string(100000, ' '));

10,000回繰り返したい文字を指定する必要があることに注意してください。std::stringは動的に拡張するように設計されているため、10,000の部分を完全にスキップできます。ライブラリは、必要なだけのメモリを割り当てます。

vector<string> str(10);

arrayC++11でも使用できます。

于 2012-05-24T10:55:04.800 に答える
2

メモリを動的に割り当てる必要があります。この場合のスタックは、それほど多くのデータを保持するのに十分な大きさではありません。

const size_t len = 10;
string* str[len]; 
for(long i=0; i<len; ++i) {
  str[i] = new string[100000];
} 

:割り当てられたメモリが不要になったら、忘れずに削除してください。

:生活を楽にするためにvector<>、メモリ管理を自動的に行う適切なコンテナ(例)を使用してください

更新:コードには他にもいくつか問題があります:

for(long i=0;i<=t;i++) // t could be lager than 9
{ 
  getline(cin,str[i][100000]); // you are accessing a non-existent element
} 

代わりに試してください:

long t;   
cin>>t;   
vector<string> str; // declare an auto-resizing container of strings   

for(long i=0; i<t; i++)
{ 
  string tmp; // this string will be able to store a lot of characters by itself
  getline(cin, tmp); // read in the next line
  str.push_back(tmp); // add the line to our container
} 

for(long i=0; i<t; i++)
{
  // do something with str[i] // values str[0]..str[t-1] are guaranteed to be valid
}
于 2012-05-24T10:50:08.907 に答える
0

ヒープにメモリを割り当てる必要があります。このような..

string *str[10];

for(int i = 0; i < 10; i++)
  str[i] = new string[100000];
于 2012-05-24T10:51:14.793 に答える
0

std :: stringを使用する場合、それは固定長ではありません-それが全体のポイントです。あなたが多分欲しいものは:

char str[10][100000];

これにより、10 xchar[100000]が得られます。現状では、10x100000の文字列のマトリックスがあります。

于 2012-05-24T10:53:06.993 に答える