c преобразование строки в int

#c #string #int

#c #строка #int

Вопрос:

 //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 выполняет это дважды, поэтому, когда я ее обрабатываю, она по какой-то причине отображает ее дважды… Почему это?

пример: ВВЕДИТЕ 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

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

1. sNumber.push_back(sLine[l 1]); может иметь доступ за пределы конца строки.

2. @Vlad Но я поместил это туда из-за отрицательных чисел…

3. Он выполняет весь цикл дважды.

4. Можете ли вы показать пример вывода для некоторых входных данных? И на несвязанном примечании, используйте isdigit вместо проверки на 't' , на всякий случай. 🙂

5. std::string s = "45"; int i = boost::lexical_cast<int>(s); кстати

Ответ №1:

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

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

 std::stringstream ss(sLine);
int num;
while(ss >> num) {
    cout << num;
}
  

Ответ №2:

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

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

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

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

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

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

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

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

1. sNumber был бы там за пределами видимости

Ответ №3:

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

Ответ №4:

Это кажется болезненным способом воссоздания колеса. Вам было бы лучше использовать stringstream для анализа этого.

 std::stringstream strm(sLine);
int num;
while(strm >> num)
{
    std::cout << num << std::endl;
}
  

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

1. Пожалуйста, не поощряйте использование условий цикла eof() или fail() as. Это почти всегда приводит к ошибкам в коде. Скорее сделайте while ( strm >> num ) { ... } . Для демонстрации злой силы eof() : ideone.com/ZKa67