2010-11-24 18 views
3

我找不到一個函數,它會讓我指定開始字符或子字符串搜索的開始位置。找到一個字符或子字符串與指定開始pos

我有,例如:

char *c = "S1S2*S3*S4"; 

我想搜索「S3」通過搜索第一「*」星號,然後將第二個星號以下,並最終獲得子「S3」封閉由那些星號。

回答

2

一個解決辦法是找到第一個星號的位置,那麼第二個星號的位置。然後使用這些位置作爲開始和結束位置來搜索S3

9

string類有一個大型的find函數系列,它將索引作爲第二個參數。 find('*', index)的重複應用應該會爲您提供您所需的。

std::string s(c); 
std::string::size_type star1 = s.find('*'); 
std::string::size_type star2 = s.find('*', star1 + 1); 
std::string last_part = s.substr(star2 + 1); 
+2

對`std :: string :: npos`檢查`star1`和`star2`是適當的。除此之外,我會推薦這個C++解決方案。 – 2010-11-24 16:09:25

1

使用

char *strchr(const char *str, int ch); 

參考見here

+0

它不讓我指定索引開始搜索第二個星號。 – cpx 2010-11-24 14:49:18

+0

@cpx使用指針算術。如果「p」是你的char指針並且「*」位於3,那麼`strchar(p + 2,'*')` – wheaties 2010-11-24 14:55:00

0
#include <string> 

std::string between_asterisks(const std::string& s) { 
    std::string::size_type ast1 = s.find('*'); 
    if (ast1 == std::string::npos) { 
     throw some_exception(); 
    } 
    std::string::size_type sub_start = ast1+1; 
    std::string::size_type ast2 = s.find('*', sub_start); 
    if (ast2 == std::string::npos) { 
     throw some_exception(); 
    } 
    return s.substr(sub_start, ast2-sub_start); 
} 
0

您可以使用strchr()。只需保存返回的指針並將其傳遞給下一個調用。由於該指針指向搜索的發生,搜索將從那裏開始。

0

以及一種可能性 - 如果你是使用C風格的char *數組字符串 - 是使用,和strchr搜索星號的出現,例如,(並沒有錯誤檢查,記)

char c []= "S1S2*S3*S4"; 

char* first = strchr(c,'*'); 
if (first) { 
    char* start = ++first; 
    char* nextast = strchr(start,'*'); 
    char* s3str = new char[nextast-start+1]; 
    strncpy(s3str,start,nextast-start); 
    s3str[next-start] = '\0'; 
} 

但使用C++字符串類來執行此操作會更容易。

相關問題