C ++写给北约语音的字母抛出随机字母

时间:2016-05-17 17:58:39

标签: c++ vector

Parden有点hacky代码,但每当我编译它,它运行正常,直到它来了字母'你',然后吐出this,我敢肯定这是一个明显简单,我忽略但是可以为了我的生活,我看到了。我做错了什么?

/*
 * Converts letter into nato phonetic equivilant
 */

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string> alphabet(26);

    alphabet[97] = "ALPHA"; //0
    alphabet[98] = "BRAVO";
    alphabet[99] = "CHARLIE";
    alphabet[100] = "DELTA";
    alphabet[101] = "ECHO";
    alphabet[102] = "FOXTROT";
    alphabet[103] = "GOLF";
    alphabet[104] = "HOTEL";
    alphabet[105] = "INDIA";
    alphabet[106] = "JULIET";
    alphabet[107] = "KILO";
    alphabet[108] = "LIMA";
    alphabet[109] = "MIKE";
    alphabet[110] = "NOVEMBER";
    alphabet[111] = "OSCAR";
    alphabet[112] = "PAPA";
    alphabet[113] = "QUEBEC";
    alphabet[114] = "ROMEO";
    alphabet[115] = "SIERRA";
    alphabet[116] = "TANGO";
    alphabet[117] = "UNIFORM";
    alphabet[118] = "VICTOR";
    alphabet[119] = "WHISKEY";
    alphabet[120] = "X-RAY";
    alphabet[121] = "YANKEE";
    alphabet[122] = "ZULU";

    std::cout << "Enter a word:" << std::endl;
    std::string word;
    getline(std::cin, word);
    std::system("clear");

    for (int i = 0; i < word.length(); ++i) {
        int num;
        num = word.at(i);
        std::cout << alphabet[num] << std::endl;

    }
}

3 个答案:

答案 0 :(得分:3)

代码中的问题是它有未定义的行为。你的向量是26个元素长,但你设置从索引97开始的元素。

要解决此问题,请将矢量设置为123个元素,或者在设置和打印时使用num-97作为索引。

std::vector<std::string> alphabet = {
    "ALPHA"
,   "BRAVO"
,   "CHARLIE"
,   "DELTA"
,   "ECHO"
,   "FOXTROT"
,   "GOLF"
,   "HOTEL"
,   "INDIA"
,   "JULIET"
,   "KILO"
,   "LIMA"
,   "MIKE"
,   "NOVEMBER"
,   "OSCAR"
,   "PAPA"
,   "QUEBEC"
,   "ROMEO"
,   "SIERRA"
,   "TANGO"
,   "UNIFORM"
,   "VICTOR"
,   "WHISKEY"
,   "X-RAY"
,   "YANKEE"
,   "ZULU"
};
...
std::cout << alphabet[num-'a'] << std::endl;

注意:如果您开始使用字符文字代替整数常量,即alphabet['u'] = "UNIFORM";而不是alphabet[117] = "UNIFORM";,则代码的可读性会提高。最终结果是相同的,但读者不必在UNICODE表中执行查找以查看代码点117的含义。

答案 1 :(得分:2)

你的程序从一开始就被打破了,因为你写的是不存在的向量位置!

一旦你开始这样做,基本上任何事情都可能发生,包括看似工作的代码,或获得奇怪的价值观,或者自发地将龙之母从她的替代现实中运送到 this 现实中进入我的邻居(是的,拜托!)。

你的矢量中有26个元素。这些元素的指数从0到25,而不是从97到122。

您可以应用一些小学算术(即减去然后再重新添加97)来抵消存储的索引,或者您可以使用std::map<int, std::string>代替(这将是我的推荐)。

答案 2 :(得分:2)

你可以像地图一样使用矢量,通过在没有元素存在的地方编制索引,也许你想要一张地图?如果是,那么:

  #include <map>

   int main()
   {
      std::map<int, std::string> alphabet;

它应该可以正常工作