2009-11-07 61 views
1

我想將字符串轉換爲雙精度值。代碼非常簡單。將字符串轉換爲雙精度的C++錯誤

  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額外的[i + 1],我得到3.如果我留下額外的字符串,程序試圖首先(2)51(ascii爲3)。到底他媽發生了什麼?

+8

我的猜測是:額外的是一個字符串,'額外的[I + 1]'如果你想轉換字符串的一部分,你可以做'atof(extra.c_str()[i + 1])' – UncleBens 2009-11-07 23:29:45

+4

這是一個字符,並且字符沒有'c_str'方法。代碼不完整 - 你錯過了「extra」的定義。 – 2009-11-07 23:31:48

+0

剛試過。 錯誤:從const char到const char的無效轉換* 錯誤:初始化double atof的參數1(const char *) – piratebill 2009-11-07 23:32:11

回答

6

聽起來像extrastd::string,所以extra[i+1]返回一個char,它是非類的類型。

這聽起來像你試圖解析從i+1 th位置開始的字符串extra。您可以通過這樣做:

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

這工作完美!謝謝。我一直在這裏一個多小時。 – piratebill 2009-11-07 23:34:53

+0

Alternativly:'extra.c_str()+(i + 1)'避免了創建一個臨時字符串對象 – sellibitze 2009-11-08 13:23:39

1

基於錯誤信息,extrastd::string型。當您執行extra[i+1]時,結果爲char,幷包含位於字符串extrai+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. 

因此額外[X]正在恢復它沒有一種方法c_str一個char()

1

你還沒有說,但我覺得「多餘」的類型的std ::的字符串。所以表達式「額外的[I + 1]是字符‘I + 1’的‘多餘’,這似乎是‘3’。

什麼是你真正想幹什麼?

如果你只是想字符I + 1通過在2002年底的「額外」(你知道是額外多長時間),你想要的東西,如:

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

爲了這個目的,最好使用'substr',因爲如果'i + 1會拋出'std :: out_of_range' '超過了字符串的末尾。 – 2009-11-07 23:40:31

+0

以臨時代價爲代價;這就是爲什麼我說「你知道額外多久」。但是,我明白你的觀點;另一種方法是在調用atof()之前「assert(i + 1 janm 2009-11-08 00:15:47

相關問題