2016-08-05 64 views
2

我要找來檢查,如果一個字符串如下功能(完全一致),對應format串 像這樣由其他參數指定的數據的模式:是否存在某種'strcmpf'實現?

/* int strcmpf (char *str1, char *format, ...); */ 
char *test = "Hello World !" 

if(!strcmpf(test, "%s%*s %c", "Hello ", '!') 
    return HELLO_HAS_BEEN_SAID; 
else 
    return PROGRAM_ISNT_POLITE; 

這個實現自己,我認爲將是非常困難,但是這種功能對於內容的語義分析非常有用。在我嘗試自己編寫這樣的函數之前,我需要知道是否已經有了一個庫或代碼片段來提供像這樣的函數的實現?


更具體地說,我需要模式匹配行爲。因此test必須完全匹配由對應於format參數的數據指定的模式。

+5

實現這樣的功能非常簡單,只需使用['vsnprintf'](http://en.cppreference.com/w/c/io/vfprintf)進行格式化,然後調用'strcmp'。 –

+1

@JoachimPileborg完全正確,但是如果我必須將它放在函數中,並且調用了'strcmp()',我仍然需要爲該函數提供可變參數。對於每個人來說,這不是「非常簡單」,你不同意嗎?至少對我來說似乎不實際.. – Malina

+0

@JoachimPileborg:現在是什麼? 「世界」來自您提出的解決方案的地方在哪裏? –

回答

3

我需要知道,如果已經有一個庫或代碼片段,提供實現的功能的這樣

標準庫有沒有這樣的功能。對於第三方庫建議的請求在這裏是無關緊要的,但就我理解您所需的功能而言,我無論如何都不瞭解現有的第三方實施。

正如我在評論中說,我建議你設計圍繞模式匹配方面善意正則表達式,而不是圍繞printf()scanf()格式(這是不完全一樣)。有幾個正則表達式庫可用於支持該部分。

+0

解釋中的問題來自於我依靠人們理解爲什麼它是'strcmpf'而不是'sscanfcmp'我猜。 – Malina

+0

我需要這樣一個函數的真正原因是爲了正確解釋gcc的stderr調試信息輸出。那就是要知道消息的實例,錯誤,警告,行鏈接,文件路徑等等:)這樣我就可以突出顯示特定的信息。 – Malina

+0

@Malina,爲此,你可能甚至不需要正則表達式。GCC診斷由四個冒號(:)分隔的字段組成,並且您可以依靠前三個冒號區域本身不包含冒號。您只需將(前三個)冒號中的診斷文本拆分並適當地處理每個碎片。你可以用'strtok()','sscanf()'或其他各種方式分割字符串。 –

相關問題