2013-04-30 100 views
1

我有以下字符串用C的sscanf從目錄路徑解析數

/foo123/bar123/card45/foofoo/1.3/ 

我想分析下面的字「卡」,這在上面的例子將是數45.應該我爲此使用sscanf,如果是這樣,我該如何去做呢?

感謝

回答

3

我應該使用sscanf爲[XYZ問題]

但是你可以使用strstrstrtol代替:

const char *s = "/foo123/bar123/card45/foofoo/1.3/"; 
const char *p = "card"; 
const char *t = strstr(s, p); 

int i = -1; // a negative number indicates a parse failure, for example 
if (t != NULL) { 
    t += strlen(p); 
    char *end; 
    i = strtol(t, &end, 10); 
    if (!end || *end != '/') { 
     // parsing the number failed 
    } 
} 
+0

謝謝..有效! – user2077092 2013-04-30 18:30:41

2

使用strstr()然後sscanf()將完成這項工作。假設你有你的源字符串的字符數組中source_string。然後使用此:

char * ptr; 
ptr = strstr(source_string,"card"); 

sscanf (ptr,"%*s %d",&number); //Sorry this is wrong!! 
sscanf(ptr,"card%d",&number); //This is right!! 
sscanf(ptr,"%*4s%d",&number); //This works too 


printf("The card number is %d",number); 

strstr()讓你在那裏「一卡通」 begins.Then你地址傳遞給sscanf()爲source.The %*s寫着「卡地址「,然後丟棄它。之後,%d讀取」卡「後面的數字,並將其存儲在整數變量number中,然後使用printf()顯示。

+0

這也適用。由於卡和號碼之間沒有空格,我只好將格式更改爲'%* [^ 0-9]%d'。 – user2077092 2013-04-30 18:32:51

+0

@ user2077092我很抱歉,我的代碼中有一個愚蠢的錯誤,當我看到您的評論時,我即將改變。您會看到'%* s'將會讀取並忽略在「卡片」之後開始的所有內容。編輯。 – 2013-04-30 18:37:45

0

如何使用簡單的分割函數來切斷'/'路徑?

這裏是我用來按特定字母拆分隨機字符數組的函數。它將每個解析的部分保存到字符串向量中。

vector<string> split(const char *str, char c) 

{ 
    vector<string> result; 

    while(1) 
    { 
     const char *begin = str; 

     while(*str != c && *str) 
       str++; 

     result.push_back(string(begin, str)); 

     if(0 == *str++) 
       break; 
    } 

    return result; 
} 

所以,你可以這樣調用

vector<string> ParsedString; 
ParsedString = split("Your/Random/path", '/'); 

這個功能之後,你可以訪問到ParsedString的各項指標看任何人都有你正在尋找特定的詞。

或者,如果您要查找的單詞始終位於前面的第3或第4個單詞上,那麼您只能選擇該單詞進行搜索。

string InterestedTarget = ParsedString[4]; 
+1

這個問題被標記爲「c」,而不是「C++」。 – 2013-04-30 18:25:32