2015-04-02 46 views
0

目前我正在關注C書,但無法解決一個練習。鑑於此時我花了1天以上,我需要一些幫助/想法。如何使用sscanf()函數獲取字符串的一部分?

「假定str是包含一個字符串‘銷售等級’立即 由#符號前面(其它字符可以先於#和/或 按照銷售排名)。一種銷售秩是一系列十進制數字 可能包含逗號,如下面的例子:

989 
24,675 
1,162,620 

寫的sscanf的調用,提取銷售排行(但不包括# 符號),並將其存儲在一個名爲sales_rank字符串變量「。

我明白了什麼是它的需要:

例如,如果我們有:

 char *str = "ana are mer2,1#3lala"; 

sales_ranks應該是: 「2,1」

的情況下:

 char *str = "ana ar#e mer2,1a3lala"; 

sales_ranks是一個空字符串。

我在這裏找到(http://cboard.cprogramming.com/c-programming/149330-getting-part-string-sscanf.html)幾個有用的信息,但它不是正確的解決方案。 他們解釋行使一種錯誤的做法是這樣的:

 char *str = "ana are mer2,1#3lala"; 

sales_ranks是「3」,這是確定的,但不是由作者要求:「銷售排名」立即編輯#符號

之前:

我誤解了誰是先於誰。 :| (所以在鏈接暴露出的解決方案是OK)

其實我花了這麼長時間才找到這種模式的解決方案: 「{十進制}#」 :)

但有可能所以? 我的意思是,如果它是可能的:#符號立即由「銷售排行」前

+1

我認爲如果銷售排名緊接前面是#符號,那麼在「2,1#3」中銷售排名是3 – Jack 2015-04-02 15:43:11

+0

是的,如果排名前面有#表示銷售排名在# ,而不是之前。 – teppic 2015-04-02 15:48:53

+0

嗯所以我誤解了模式應該是「#」。 其實應該是「#」:? – valicfu 2015-04-02 15:50:51

回答

1

您可以使用sscanf的與%[]%*語法來實現這一目標:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char sales_rank[200]; 
    char *str; 

    sales_rank[0] = 0; 
    str = "ana are mer2,1#3lala"; 

    sscanf(str, "%*[^#]#%199[0-9,]", sales_rank); 
    printf("sales_rank=%s\n", sales_rank); 

    return 0; 
} 

%*[^#]將跳過在#之前的字符,忽略它們和%199[0-9,]將把sales_rank字符串存儲在變量中。在閱讀sales_rank後,匹配過程將停止。任何其他字符將被忽略。

+0

** skip **有點不恰當。 '%* [^#]'將**匹配除'#'以外的所有字符,並且由於'''後面的'%',**丟棄**匹配的所有字符。任何丟棄的匹配都不會增加'sscanf'返回的匹配計數。所以是的,它會實際上**跳過**所有字符到'#',但這並不是真的。還是一個很好的答案。 – 2015-04-02 19:26:35

+0

我在答案的最後添加了一點。看看它,讓我知道你是否有任何異議。 – 2015-04-02 19:30:20

+0

@David C. Rankin。因爲您的精確度是恰當的,所以當然沒有異議。 – 2015-04-02 20:05:11