2013-09-10 2 views
0

Привет, я сделал сообщение раньше, хотя считаю, что это было довольно неоднозначно, поэтому я попробую еще раз и по-другому слову.Ошибка while/for loop

Я пытаюсь написать программу, которая берет ввод двух английских чисел и преобразует их в целые числа (используя массивы), выполняет вычисления, а затем преобразует их обратно в английские слова.

Например:

Ввод данные пользователя: sixty_six + шесть Выход: seventy_two

Ввод данные пользователя: forty_four - четыре Выход: сорок

и т.д.

Однако я были проблемы с выяснением проблемы в моем коде, провел последний час или так пытаюсь найти проблему, хотя я не смог. Поэтому, надеюсь, кто-то здесь может помочь мне.

Мой код cout есть так trank, где в цикле он идет не так, кажется, работает так, как предполагалось, до второй линии cout. означает, что он выводит the token is forty и tens is euqal to, а затем он терпит неудачу и заканчивается:

nt Wordnum::read_number(string n) { 
    int result_ten = 0; 
    int result_unit = 0; 
    int j = 0; 

    // Loops through input and turns it all to lower case. 

    while (n[j]) { 
     char c; 

     c = n[j]; 
     c = (tolower(c)); 
     n[j] = c; 
     j++; 
    } 

    string delimiter = "_"; 
    size_t pos = 0; 
    string token; 

    // Checks for the _ delimiter and takes the first token then checks it against the array to "convert" from string to int. 
    while ((pos = n.find(delimiter)) != string::npos) { 
     token = n.substr(0, pos); 

     cout << "Token is: '" << token << "'" << std::endl; 

     for (int i = 0; i < 20; i++) { 
      if (token == tens[i]) { 
       result_ten = i * 10; 
       n.erase(0, pos + delimiter.length()); 
       cout << "tens is equals to: " << result_ten << endl; 
      } else if (token == units[i]) { 
       result_unit = i; 
       n.erase(0, pos); 
      } 
     } 

     result_ten = (result_ten + result_unit); 

     cout << "ten is equals to: " << result_ten << endl; 
    } 

    return result_ten; 
} 

массивы, которые используются:

string const Wordnum::units[] = {"zero", "one", "two", "three", "four", "five", 
    "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
    "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; 

string const Wordnum::tens[] = {"zero", " ", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; 

Спасибо заранее. Если что-то неясно, я попробую и объясню это лучше.

+1

Compile со всеми предупреждениями и информацией для отладки (например, 'г ++ -Wall -g') и узнать, как использовать отладчик (например,'gdb'), чтобы запустить вашу программу шаг за шагом. –

+1

Имейте в виду, что std :: string не имеет нулевой завершенной c-строки –

ответ

1

INT Wordnum :: read_number (строка п) {

int result_ten = 0; 
int result_unit = 0; 
int j = 0, f3 =0; 
// Loops through input and turns it all to lower case. 
while (n[j]) { 
    char c; 

    c = n[j]; 
    c = (tolower(c)); 
    n[j] = c; 
    j++; 
} 
string delimiter = "_"; 
size_t pos = 0, pos1 = 0; 
string token; 
// Checks for the _ delimiter and takes the first token then checks it against the array to "convert" from string to int. 

if((pos = n.find(delimiter)) != string::npos) { 
    token = n.substr(0, pos); 
}else 
{ 
    token = n.substr(0, n.length()); 
    f3 = 1; 
} 

for (int i = 0; i < 20; i++) { 
    if (token == tens[i]) { 
     result_ten = i * 10; 
     i=0; 
     if(f3 == 1) 
      break; 
     token = n.substr(pos+1,(n.length()-pos-1)); 
    } else if (token == units[i]) { 
      result_unit = i; 
      break; 
    } 
}## End of loop for converting the string to int ## 
result_ten = (result_ten + result_unit); 
cout << "value is : " << result_ten << endl; 
return result_ten; 

}

Пожалуйста, проверьте это, Надеюсь, что это поможет вам

+0

Спасибо, что это хорошо работает, мне нужно помнить о том, кажется. – user1719605

3

Вы пытаетесь проиндексировать tens[i], в то время как я иду от [0,20). Однако в десятках нет 20 индексов.

2

Ваша ошибка в вашем для цикла:

for (int i = 0; i < 20; i++) { 
    //    ^^ 
    if (token == tens[i]) { 
    //   ^^^^^^^ 
    // ... 
} 

i идет от 0 к 19 включен. И вы пытаетесь индексировать tens[i]. Но:

string const Wordnum::tens[] = {"zero", " ", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; 

эта линия показывает нам, что tens имеет только 10 элементы. У вас есть известная ошибка out-of-bounds.

Вы можете решить эту проблему с помощью:

for (int i = 0; i < 20; i++) { 
    if (i < 10 && token == tens[i]) { 
    // ^^^^^^^^^^ 
    // ... 
} 

Я не уверен, что ваш алгоритм даст ожидаемый результат, но, по крайней мере, ваша программа не будет врезаться.