gccを使用して完全に実行されますが、ビジュアルスタジオ2017で「ベクトル添え字が範囲外です」ランタイムエラーが発生しました。デバッガを使用している場合、countWords(&v, "hello");
関数呼び出しでエラーが表示されます。どうすれば修正できますか?ここvC++でランタイムエラーが発生しましたが、gccではありません
#include <iostream>
#include <vector>
using namespace std;
struct Trie {
int prefixes;
int words;
vector<Trie*> edges;
};
typedef Trie vertex;
void initialize(vertex *v)
{
v->words = 0;
v->prefixes = 0;
v->edges.resize(26);
for (int i = 0; i < 26; i++)
{
v->edges[i] = nullptr;
}
}
void addWord(vertex* v, string word)
{
if (word == "")
{
v->words++;
}
else
{
v->prefixes++;
int k = word[0] - 'a' - 1;
if (v->edges[k] == nullptr)
{
v->edges[k] = new Trie;
initialize(v->edges[k]);
}
int word_len = word.length();
addWord(v->edges[k], word.substr(1, word_len - 1));
}
}
int countWords(vertex* v, string word)
{
char k = word[0];
if (word == "")
return v->words;
else if (v->edges[k] == nullptr)
return 0;
else
return countWords(v->edges[k], word.substr(1, word.length() - 1));
}
int main()
{
Trie v;
initialize(&v);
addWord(&v, "hello");
countWords(&v, "hello");
cin.get();
}
Visual Studioマーケティング名!=コンパイラのバージョン。 Visual StudioはIDEで、MSVCはVisual Studioと共にインストールできるコンパイラです。別々のものです。 GCCのバージョンとMSVCのバージョンの両方を指定してください。 – tambre
gcc 6.0およびmsvc 19.10.25019 – XZ6H
MSVC++には、デバッグビルドでデフォルトで有効にされたイテレータデバッグ機能があり、このプログラムでUBをキャッチするのに便利です。デバッガは、スタックトレースから何がうまくいかなかったかを簡単に表示できます。 'edges 'には26個の要素があり、おそらく' A '..' Z 'を意味します。しかし、あなたは「h」、インデックス104でそれを索引付けしています。Kaboom。 –