В файле содержится строка "Число 10 число 20". Первое число обрабатывается, а на второе выдает стабильно 0. При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) - все работает. В чем может быть проблема?
int main()
{
setlocale(LC_CTYPE, "rus");
string line;
ifstream in("F:\\foo.txt");
if (in.is_open())
{
getline(in, line);
}
int digits = line.find_first_of("1234567890");
int digits2 = line.find_last_of("1234567890");
int number = atoi(line.c_str() + digits);
int number2 = atoi(line.c_str() + digits2);
cout << number << endl;
cout << number2 << endl;
in.close();
system("pause");
return 0;
}
Итак,
int digits2 = line.find_last_of("1234567890");
Что же мы видим в "Число 10 число 20"
? Точно! Самую распоследнюю цифру - 0 из 20.
int number2 = atoi(line.c_str() + digits2);
Что же тут такое line.c_str() + digits2
? Это строка "0"
Что atoi
должен вернуть для такой строки, как не 0?
И чему вы удивлены? И - с индексами:
Число 10 число 20
1111111
01234567890123456
Все верно, 6 - индекс, с которого начинается 10 число 20, 16 - индекс последнего нуля...
При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) - все работает
Вы совершенно правильно заметили, что второй индекс равен 16. А теперь посмотрите, на какой символ он указывает
Число 10 число 20
^^^^^^^^^^^^^^^^^
1111111
01234567890123456
Т.е. digits2
указывает на последнюю цифру в строке. Что как бы логично. Строка
int digits2 = line.find_last_of("1234567890");
находит последнее вхождение цифры.
Чтобы программа работала, вам нужно сместиться влево от digits2
на начало числа
Алгоритм решения: (предлагаю Вам переписать Ваш вариант)
1) Разбить строки на лексемы через stringstream
2) проверить цифры или нет
3) обработать (сделать то, что Вам нужно)
Вместо файла будет просто строка(представим что Вы туда сдампили файл) Вот Вам 2 схожих метода как это сделать
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <cctype>
#include <iterator>
void foo(std::string str) {
std::cout << "first" << std::endl;
std::stringstream ss{ str };
std::string tmp{};
std::vector<int64_t> data_v;
while (ss >> tmp) {
if (std::all_of(std::begin(tmp), std::end(tmp), std::isdigit)) {
data_v.push_back(std::stoi(tmp));
}
}
for (const auto& v : data_v) {
std::cout << v << std::endl;
}
}
void foo2(std::string str) {
std::cout << "second" << std::endl;
std::stringstream ss(str);
std::istream_iterator<std::string> begin(ss), end;
std::vector<std::string> vec_str(begin, end);
std::vector<int> data_v;
auto f{ [&](const std::string& s) { if (std::count_if(std::begin(s), std::end(s), std::isdigit) == s.size()) { data_v.push_back(std::atoi(s.c_str())); }} };
std::for_each(std::begin(vec_str), std::end(vec_str), f);
for (const auto& v : data_v) {
std::cout << v << std::endl;
}
}
int main() {
std::string str{ "num 10 num 20" };
foo(str);
foo2(str);
return 0;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему не появляется MessageBox перед закрытием программы - после завершения оконной процедуры и соблюдения условия его вызова? А появляется...
Имеется файл inputtxt с таким содержимым: qwer qwe qwe qwerty