2012-07-24 51 views
-3

我試着從回答我以前的question的其中一個人那裏得到下面的代碼。在字符串上使用strtok()的C++用法

我的情況是我想要得到這個字符串中的值1.2597,我的非功能需求是使用strtok而不是boost,這是許多其他編碼人員在這裏推薦的。

但是,我將一個問題轉換爲可以使用strtok的cstr *。

我想知道我怎樣才能1.2597,與strtok

string result= "CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]"; 

char *first = strtok(result, ' '); 
char *second = strtok(0, ' '); 
+2

'的strtok()'需要'字符*',而不是一個'的std :: string'(不傳' std :: string :: c_str()'as strtok()'修改提供的字符串)。改爲使用'std :: istringstream'。 – hmjd 2012-07-24 09:59:49

+0

只要使用'std :: string.find()'就像你在問題中找到條件一樣。 – steffen 2012-07-24 10:07:21

+0

我的項目得到了使用strtok來拆分字符串的要求。 – 2012-07-24 10:56:01

回答

2

回聲它不能直接在C++ std::string使用strtok。它需要一個可變的零終止的C風格的字符串,並且沒有標準的方式來訪問這種形式的std::string的內容。

最簡單的方法(不使用升壓或其他非標準庫)是使用C++流來代替:

std::stringstream stream(result); 
std::string first, second; 
stream >> first >> second; 

這也可能直接轉換到第二令牌爲數字型,如果這就是你想。

如果你真的想用strtok出於某種原因,那麼一種可能性是將字符串複製到一個臨時可變的緩衝區:

std::vector<char> temp(result.begin(), result.end()); 
temp.push_back(0); 

char * first = strtok(&temp[0], ' '); 
char * second = strtok(0, ' '); 

注意其他主要故障與strtok:它不是線程安全。

1

這工作:

std::string result= "CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]"; 
size_t pos0 = result.find(' ');+1 
size_t pos1 = result.find(' ',pos0); 
std::string final_result = result.substr(pos0,pos1-pos0); 
+0

您的代碼確實有用,但我需要使用strtok函數來進行分割。 – 2012-07-24 10:50:37

+0

「分裂」是什麼意思? – steffen 2012-07-24 11:01:25

1

呀,麥克西摩說,你有你的std :: string複製到一個可變的緩衝區。已經包含string.h,只需使用strcpy將std :: string複製到一個可變的char *。不要忘記包括用於空終止空間+實際插入的 '\ 0'; d

std::string result = "..."; 
char* token; 
char* buffer[res.length() + 1]; //Space for '\0' 
strcpy(buffer, result.c_str()); 
buffer[res.length()] = '\0';  //insert '\0' 
token = strtok(buffer, " "); 
while (token != NULL) { 
    /* work with token */ 
    token = strtok(NULL, " "); 
} 
+0

如何在此之後獲得令牌? – 2012-07-24 11:16:01

+0

在while循環中。如果你發現你的令牌,只需使用「break」語句離開循環。 「令牌」現在持有你希望進一步工作的標誌。 – 2012-07-24 13:05:14