Строка перепутана по неизвестной причине

#c #string #class

#c #строка #класс

Вопрос:

Я пытался создать программу для преобразования римских цифр в арабские цифры, но по какой-то причине, когда он переходит к функции 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[], но безуспешно.

Что еще более странно, так это тот факт, что однажды я удалил весь случай переключения string.at () возвращает правильную строку, похоже, что строка каким-то образом запутывается во время переключения. То же самое происходит с использованием оператора if вместо переключателя.

Заранее спасибо.

Комментарии:

1. Это был сломанный код или что-то в этом роде. Возможно, это было вызвано ведущим комментарием, который у вас был в той же строке. Отступ на четыре пробела (с помощью {} кнопки) работает лучше всего.

2. Не похоже, что для вашего массива была выделена какая-либо память? Попробуйте заменить int Numeri[]; на int Numeri[100];

3. Вы имеете в виду тот факт, что часть объяснения была внутри кода, верно? Спасибо за совет! @Carcigenicate

4. @StephenQuan спасибо, это исправлено! Я думал, что выделение памяти происходит автоматически, когда внутри скобок ничего нет. Раньше это выдавало мне ошибки (гибкий элемент массива не в конце класса), но перемещение его в конец класса исправило это. Теперь я должен разобраться со всем остальным.

Ответ №1:

попробуйте следующий код, он работает отлично.

 #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;
}