2013-03-20 4 views
0

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

std::string strToEng(std::string s) 
{ 
    int sInt = atoi(s.c_str()); 


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

    switch(s.size()) 
    { 
    case 1: 
    { 
     int temp = int(s[0]); 
     return digit1[temp]; 
    } 
    } 

    return "error"; 
} 

Проблема связана с массивом digit1 в инструкции switch. Когда я компилирую этот код, случай 1 не возвращает нужный результат. Если я изменил цифру1 [temp] на некоторую константу (например, цифру1 [3]), она отобразится правильно. Есть ли проблема с использованием переменной для индексации массива? Как я могу это решить?

EDIT: Возможно, обманчиво, что у меня нет способа обработки цифр выше девяти, но они все еще содержатся в цифре1. Причина этого в том, что этот код был переписан несколько раз.

+2

* «Есть ли проблема с использованием переменной для индексации массива?» * Господи, надеюсь, нет. – WhozCraig

+1

Проблема выглядит так, как будто это связано с преобразованием 'int (s [0])'. Это для меня выглядит как актерский состав, который просто интерпретирует байты от char до int, и это зависит от значения ascii. '1' - это не то же самое, что 1. Вам нужно использовать какой-либо метод для преобразования этого символа в int. (Я вижу, что вы уже используете atoi в своем коде) – Porkbutts

+0

'int temp = int (s [0]);' ??? включить s.size() ??? Это не хорошо. –

ответ

2

Вы должны использовать digit1[sInt] как вы уже преобразовали строку в значение INT ...

s[0] это только первый символ строки, так что, если первый символ '0', то его значение равно 48 (см ASCII таблица), а затем вы получаете доступ к 49-му элементу таблицы. В вашем случае 1 вы можете попробовать int(s[0])-'0', и он должен работать.

+0

А, спасибо! Я этого не думал. Кажется, это лучшее решение. Я не использую sInt для этой цели (на самом деле я думал, что я удалил его ...) по той причине, что я планирую расширить это, чтобы обрабатывать несколько цифр. – Do8fe7aevol4lopo

+0

@Steven J Wayne Esq: atoi уже обрабатывает несколько цифр для вас. –

0

Вы передаете первый символ s в int, так что если s содержит цифру, значение находится в диапазоне значений ASCII для десятичных цифр, которые составляют от 48 до 57. Почему не использовать int sInt, который вы правильно создаете первая строка вашей функции?

Смежные вопросы