上記の私のコメントの解決策として、あなたが提示したコードのC++バージョンは次のとおりです。
typedef map<std::string, int> wc;
int main() {
int c;
string cc, nombre;
wc m;
std::cin >> c;
while (c--) {
std::cin >> cc;
std::getline(std::cin, nombre);
m[cc] += 1; // This should work
}
printmap(m);
}
http://ideone.com/2JP82
まず、コード内の、を指すstd::map
キーに基づいてデータを並べ替えます。したがって、のテキストを置き換えると、マップのキーが変更され、すべてが壊れます。マップのキーは決して変更してはなりません。C ++を使用しているため、使用しないでください。代わりに使用してください。これは(「値型」であるため)すべてが魔法のように機能するようになります。機能を表示していないので、以前はどのように機能していたのかわかりません。char*
char cc[75]
cc
char[]
std::string
printmap
2番目:printmap
1行を読むたびに電話をかけますが、 map
「最後に追加されたもの」を印刷する方法がないため、そのアイデアはまったく意味がありません。printmap
呼び出しはおそらくマップ全体を印刷し、ループの外側にあるはずです。
第三に:使用しないでくださいscanf
、それは安全ではありません。ストリームを使用します。1std::cin >> cc
つの単語std::getline(std::cin, nombre)
を読み取る場合、または行に残っているものを読み取る場合。そうすれば、誰かがその行に入力してもコードがクラッシュすることはありません(最長の国名と最長の姓のソース)
Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster