#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