我无法在Windows上正常使用此功能。在linux上编译它会返回预期值,但在Windows上它会返回一些随机数。
typedef enum wezly {
elektrownie1,
konwencjonalne1,
niekonwencjonalne1,
weglowa1,
jadrowa1,
sloneczna1,
wiatrowa1,
geotermiczna1,
gazowa1,
wodna1,
maremotoryczna1,
maretermiczna1
};
wezly wybor_wezla(string opcja)
{
string bb;
bb = opcja;
if ((bb.compare("[elektrownie]")==0)||(bb.compare("[ELEKTROWNIE]")==0))
return elektrownie1;
else if ((bb.compare("[konwencjonalne]")==0)||(bb.compare("[KONWENCJONALNE]")==0))
return konwencjonalne1;
else if ((bb.compare("[gazowa]")==0)||(bb.compare("[GAZOWA]")==0))
return gazowa1;
else if ((bb.compare("[wodna]")==0)||(bb.compare("[WODNA]")==0))
return wodna1;
// (and so on...)
}
int main()
{
cout << wybor_wezla("[gazowa]");
}
在linux上我得到7,在windows上有一些随机数....
为什么会这样?
答案 0 :(得分:3)
这实际上是在这里打破了(看了the link you gave in the comments之后):
bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-1);
如果输入是“...... [无论如何] ......”,这会导致提取类似“[whateve”的字符串。
我认为你的意思是:
bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-opcja.find_first_of("[")+1);
这导致从输入中提取类似“[whatever]”的字符串。
给定输入“[gazowa]”的原始代码将比较“[gazow”到各种字符串,none将匹配,并且将在不命中return
语句的情况下到达函数的结尾。 / p>
这会导致未定义的行为。因此,当[gazowa]
给你8时,你在linux上的结果为7,在windows上有其他一些值。
您还需要做一些更明智的事情来处理没有任何字符串匹配的情况,即如果达到wybor_wezla
的结尾。在这种情况下你做的事情取决于你,但作为一个开始,我至少在那里放一个打印声明,以便你知道什么时候没有匹配。
答案 1 :(得分:1)
您的代码缺少最终的else
子句:
wezly wybor_wezla(string opcja)
{
if(...)
return ...;
else if(...)
return ...;
else if(...)
return ...;
// No final else!
}
如果if
子句都不为真,则它会在不返回值的情况下从函数末尾开始,即未定义行为。在这种情况下,它返回垃圾值,但可能会发生更糟糕的事情。
您的第一个操作应该是添加最终else
条款。这可以返回默认值,错误代码,抛出异常,abort()
等,但不能做任何事情。如果你知道价值必须是一组有限的东西,你可以将最终的else if
更改为else
,并假设如果它不是第一个N-1
的东西,它就是Nth
事。
完成后,您需要弄清楚为什么您的数据不会落入预期的情况之一并修复它。