字符串因未知原因而搞砸

String gets messed up for unknown reason

本文关键字:未知 字符串      更新时间:2023-10-16

我试图制作一个程序将罗马数字转换为阿拉伯数字,但由于某种原因,当他进入函数setNumeri时,输入文本甚至在到达转换部分之前就被搞砸了。

问题是函数setNumeri,你可以忽略其他所有内容,因为我粘贴了所有内容以确保不会遗漏任何东西。

对于某些变量是意大利语的事实,我深表歉意,但它应该非常简单。

代码如下:

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

class IX{
public:
void setNumeri(string rom);
void setArabo();
int getArabo();
private:
int length;
int Arabo;
int Numeri[];
};
void IX::setNumeri(string rom){
length = rom.length();
for(int i = length - 1; i >= 0; i--) {
cout << rom.at(i) << endl;
switch (rom.at(i)){
case 'I':
Numeri[i] = 1;
break;
case 'V':
Numeri[i] = 5;
break;
case 'X':
Numeri[i] = 10;
break;
case 'L':
Numeri[i] = 50;
break;
case 'C':
Numeri[i] = 100;
break;
case 'D':
Numeri[i] = 500;
break;
case 'M':
Numeri[i] = 1000;
break;
}
}
}
void IX::setArabo(){
int counter = Numeri[length];
for(int i = length - 1; i >= 0; i--){
if(Numeri[i] == 0) {
counter = counter + Numeri[i];
} else if(Numeri[i] > Numeri[i-1]) {
counter = counter - Numeri[i-1];
i--;
} else if(Numeri[i] <= Numeri[i-1]) {
counter = counter + Numeri[i-1];
}
}
Arabo = counter;
}
int IX::getArabo(){
return Arabo;
}
int main(){
IX lol;
string hellothere;
cout << "Roman numeral:" << endl << endl;
cin >> hellothere;
lol.setNumeri(hellothere);
cout << lol.getArabo() << endl;
return 0;
}

当我输入XIII时,输出是:

I
I
□
-107362937

最后一个不祥的数字是转换的结果,而前 3 个字符(一个在操作中丢失,一个根本无法识别)是 string.at() 的输出,如您所见,它在正确处理字符串字符方面做得非常出色。尝试改用字符串[],但没有成功。

更奇怪的是,一旦我删除了整个开关大小写 string.at() 得到正确的字符串,看起来字符串在开关部分以某种方式搞砸了。使用 if 语句而不是开关也会发生同样的情况。

提前谢谢。

尝试按照代码运行良好。

#include <cstdlib>
#include <string>
using namespace std;

class IX{
public:
void setNumeri(string rom);
int getArabo();
private:
int length;
int Numeri[100];
};
void IX::setNumeri(string rom){
length = rom.length();
for (int i = 0; i < 100; i++)
{
Numeri[i]=-1;
}
for(int i = length - 1; i >= 0; i--) {
cout << rom.at(i) << endl;
switch (rom.at(i)){
case 'I':
Numeri[i] = 1;
break;
case 'V':
Numeri[i] = 5;
break;
case 'X':
Numeri[i] = 10;
break;
case 'L':
Numeri[i] = 50;
break;
case 'C':
Numeri[i] = 100;
break;
case 'D':
Numeri[i] = 500;
break;
case 'M':
Numeri[i] = 1000;
break;
}
}
}
int IX::getArabo(){
int sum=0;
for (int i = 0; i < 100; i++)
{
if (Numeri[i]==-1)
{
return sum;
}
else
{
sum+=Numeri[i];
}

}
}
int main(){
IX lol;
string hellothere;
cout << "Roman numeral:" << endl << endl;
cin >> hellothere;
lol.setNumeri(hellothere);
cout << lol.getArabo() << endl;
return 0;
}