2009-11-07 2 views
1

Я пытаюсь преобразовать строку в double. Код очень прост.Ошибка C++ преобразования строки в double

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

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

error: request for member c_str in extra.std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator](((unsigned int)(i + 1))), which is of non-class type char

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

+8

Моя догадка: дополнительная строка, 'дополнительный [я + 1]' это char, а char не имеет метода 'c_str'. Если вы хотите преобразовать часть строки, вы можете сделать что-то вроде' atof (extra.c_str() [i + 1]) ' – UncleBens

+4

Это код не является полным - вам не хватает определения «extra». –

+0

Просто попробовал это. Ошибка: неверное преобразование из const char в const char * ошибка: инициализирующий аргумент 1 из double atof (const char *) – piratebill

ответ

6

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

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

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

Это сработало отлично! Спасибо. Я занимаюсь этим более часа. – piratebill

+0

Alternativly: 'extra.c_str() + (i + 1)', который избегает создания временного объекта строки – sellibitze

1

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

Возможно, это не то, что вы намеревались.

Как исправить, заменить extra[i+1] с новой строки, следующим образом:

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

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

stringstream ss(str_quan); 
double first; 
ss >> first; 
0

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

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

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

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

Таким образом, дополнительный [х] возвращает символ, который не имеет метода c_str()

1

Вы не сказали, но я думаю, что «лишние» имеет тип станд :: строка. Таким образом, выражение «экстра [я + 1] является символ„я + 1“из„экстра“, который, кажется,„3“.

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

Если вы просто хотите символов я + 1 до конца «экстра» (и вы знаете, как долго экстра), вы хотите что-то вроде:

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

. Для этой цели рекомендуется использовать 'substr', поскольку он будет вызывать' std :: out_of_range', если 'i + 1 'находится за концом строки. –

+0

За счет временного; вот почему я сказал: «И ты знаешь, сколько еще лишних». Тем не менее, я считаю, альтернативой будет «assert (i + 1 janm

Смежные вопросы