Ошибка С++ при преобразовании строки в двойную

Я пытаюсь преобразовать строку в двойную. Код очень простой.

            double first, second;
            first=atof(str_quan.c_str());
            second=atof(extra[i+1].c_str());
            cout<<first<<" "<<second<<endl;
            quantity=first/second;

при попытке преобразовать extra компилятор бросает мне эту жемчужину мудрости:

ошибка: запрос члена c_str в extra.std::basic_string‹_CharT, _Traits, _Alloc>::operator[] [с _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator](((unsigned int )(i + 1))), который имеет неклассовый тип char

Я понятия не имею, что это значит. если я вычисляю extra[i+1], я получаю 3. Если я оставляю extra в виде строки, программа пытается сначала разделить (2) на 51 (ascii для 3). Что, черт возьми, происходит?


person piratebill    schedule 07.11.2009    source источник
comment
Мое предположение таково: extra — это строка, extra[i + 1] — это char, а у char нет метода c_str. Если вы хотите преобразовать часть строки, вы, вероятно, можете сделать что-то вроде atof(extra.c_str()[i + 1])   -  person UncleBens    schedule 08.11.2009
comment
Этот код неполный - вам не хватает определения дополнительного.   -  person nobody    schedule 08.11.2009
comment
Только что попробовал. ошибка: неверное преобразование из const char в const char* ошибка: инициализация аргумента 1 двойного atof(const char*)   -  person piratebill    schedule 08.11.2009
comment
@UncleBens - +1 за самоотверженный поступок правильного ответа в качестве комментария   -  person Steg    schedule 08.11.2009
comment
Код полный, я просто не весь его выложил. Я могу, если ты думаешь, что это поможет.   -  person piratebill    schedule 08.11.2009
comment
Извините, сделайте это atof(extra.c_str() + i + 1), иначе вам нужно будет взять адрес, если вы хотите проиндексировать массив символов: atof(&extra.c_str()[i + 1])   -  person UncleBens    schedule 08.11.2009


Ответы (4)


Похоже, что extra — это std::string, поэтому extra[i+1] возвращает char, который не относится к классу.

Похоже, вы пытаетесь проанализировать строку extra, начиная с i+1 позиции. Вы можете сделать это, используя:

second = atof(extra.substr(i + 1).c_str());
person James McNellis    schedule 07.11.2009
comment
Это сработало отлично! Спасибо. Я был в этом больше часа. - person piratebill; 08.11.2009
comment
В качестве альтернативы: extra.c_str()+(i+1), который позволяет избежать создания временного строкового объекта. - person sellibitze; 08.11.2009

Судя по сообщению об ошибке, extra относится к типу std::string. Когда вы делаете extra[i+1], результат имеет тип char и содержит символ в строке extraв позиции i+1.

Вероятно, не то, что вы хотели.

В качестве исправления замените extra[i+1] новой строкой, как показано ниже:

extra2 = extra.substr(i+1);
// ...
second=atof(extra2.c_str());

Лучший способ справиться с этим преобразованием (который менее подвержен ошибкам) ​​— использовать строковые потоки:

stringstream ss(str_quan);
double first;
ss >> first;
person greyfade    schedule 07.11.2009

Вы не сказали, но я думаю, что «дополнительный» имеет тип std::string. Таким образом, выражение «extra[i+1]» — это символ «i+1» слова «extra», который выглядит как «3».

Что вы на самом деле пытаетесь сделать?

Если вам просто нужны символы i+1 до конца слова «extra» (и вы знаете, сколько времени занимает extra), вам нужно что-то вроде:

 second = atof(extra.c_str() + i + 1);
person janm    schedule 07.11.2009
comment
Для этой цели предпочтительнее использовать substr, так как он выдаст std::out_of_range, если i + 1 находится за концом строки. - person James McNellis; 08.11.2009
comment
За счет временного; вот почему я сказал, и вы знаете, сколько времени это дополнительно. Тем не менее, я понимаю вашу точку зрения; альтернативой может быть assert(i + 1 ‹ extra.size()) перед вызовом atof(). Поскольку мы делаем этот код более идиоматичным C++, мы бы отказались от atof() и, возможно, использовали boost::iterator_range и boost::lexical_cast... - person janm; 08.11.2009

При обращении за помощью часто бывает недостаточно предоставить компилируемый пример.

Мое предположение (и я подчеркиваю предположение, потому что не хватает информации о типе или номеров строк).

second=atof(extra[i+1].c_str());

// Guess 
// extra is std::string.

Таким образом, extra[x] возвращает символ, у которого нет метода c_str().

person Martin York    schedule 07.11.2009