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;
}
}
答案 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;
它应该可以正常工作