C ++ преобразование строки в Int - PullRequest
0 голосов
/ 04 ноября 2011
//sLine is the string
for(int l = 0; l < sLine.length(); l++)
{
    string sNumber;
    if(sLine[l] == '-')
    {   
        sNumber.push_back(sLine[l]);
        sNumber.push_back(sLine[l + 1]);
        l++;
    }
    else if(sLine[l] != '\t')
    {
        sNumber.push_back(sLine[l]);
    }
    const char* testing = sNumber.c_str();
    int num = atoi(testing);
    cout << num;
}

У меня есть цикл for, который проверяет каждый символ строки и преобразует каждое число в этой строке в int.Но по какой-то причине функция atoi делает это дважды, поэтому, когда я выполняю couting, она отображает его дважды по какой-то причине ... Почему это так?

пример: INPUT 3 3 -3 9 5
-8 -2 9 7 1
-7 8 4 4 -8
-9 -9 -1 -4 -8

ВЫХОД 3030-309050 -80-20907010
-70804040-80
-90-90-10-40-80

Ответы [ 4 ]

10 голосов
/ 04 ноября 2011

Отображается ноль для всех нераспознанных символов, потому что atoi возвращает 0 при задании нечисловой строки (как пробел!)

Однако то, что вы хотите сделать, шокирующе просто:

std::stringstream ss(sLine);
int num;
while(ss >> num) {
    cout << num;
}
0 голосов
/ 04 ноября 2011

Это похоже на болезненный способ воссоздать колесо. Вам лучше использовать поток строк, чтобы разобрать это.

std::stringstream strm(sLine);
int num;
while(strm >> num)
{
    std::cout << num << std::endl;
}
0 голосов
/ 04 ноября 2011

Вы выводите дополнительные 0 для символов, которые не являются цифрами. Проблема в том, что atoi возвращает 0, когда не может преобразовать входные данные, поэтому пробелы выводятся как нули.

0 голосов
/ 04 ноября 2011

Переместить это:

const char* testing = sNumber.c_str();
int num = atoi(testing);
cout << num;

Ниже последнего } в коде, который вы вставили, т.е. вне цикла for. В настоящее время вы получаете отдельную распечатку для каждого символа в sLine, потому что она выполняется на каждой итерации цикла. (Последний символ в sLine может быть переводом строки, поэтому это может произойти, даже если вы думаете, что написали только одну цифру.)

Редактировать: также переместите объявление sNumber выше цикла for.

Вы также можете изменить if (sLine[l] == '-') на if (sLine[l] == '-' && (l + 1) < sLine.length()), чтобы вы не могли получить доступ за концом строки, если тире является последним символом в строке.

Вы также можете переименовать переменную l во что-то, что выглядит менее похоже на 1. =)

Вы также можете переосмыслить, если это правильный способ сделать это вообще (обычно, если простая вещь усложняет, есть вероятность, что вы делаете это неправильно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...