簡體   English   中英

C語言。 如何在 SSCANF 中使用字符串值作為分隔符

[英]C Language. How to use a string value as delimiter in SSCANF

有沒有辦法使用字符串作為分隔符? 我們可以使用字符作為分隔符使用 sscanf();

示例我有char url[]="username=jack&pwd=jack123&email=jack@example.com"

我可以用。 char username[100],pwd[100],email[100]; sscanf(url, "username=%[^&]&pwd=%[^&]&email=%[^\\n]", username,pwd,email);

它適用於這個字符串。 但對於url="username=jack&jill&pwd=jack&123&email=jack@example.com"

它不能被使用......它可以刪除 SQL 注入......但我想學習一個使用 &pwd,&email 作為分隔符的技巧......不一定與 sscanf 一起使用。 更新:解決方案不一定需要使用 C 語言。 我只想知道一種使用字符串作為分隔符的方法

只需編寫自己的解析代碼 在許多情況下,在內存中表示已解析的AST很有用。 但是一定要指定並記錄您的輸入語言(可能使用EBNF表示法)。

您的輸入語言(您尚未在問題中定義)似乎類似於HTTP POST請求中使用的MIME類型application/x-www-form-urlencoded 因此,您可能至少會尋找與 HTTP 服務器處理(如libonion )和 HTTP 客戶端處理(如libcurl )相關的免費軟件庫的源代碼,以獲得靈感。

您可以使用getline (或者可能是fgets )讀取整行,然后適當地解析它。 帶有%nstrtok sscanf可能有用,但您也可以“手動”解析該行(考慮使用例如您的遞歸下降解析器)。 您也可以使用strchrstrstr

順便說一句,在許多情況下,使用常見的文本表示形式(如JSONYAML 、 XML )會很有幫助,而且您可以輕松找到許多庫來處理它們。

另請注意,可以使用fmemopen和/或open_memstream將字符串作為FILE*處理。

您可以使用解析器生成器,例如bison (帶有flex )。

在某些情況下,正則表達式可能很有用。 請參閱regcomp和朋友。

因此,您想要實現的目標很容易做到並且是標准做法。 但是您需要的不僅僅是sscanf並且您可能想要結合幾件事。

許多外部庫(例如來自 GTK 的glib )提供了一些解析。 你應該關心 UTF-8(今天,你到處都有UTF-8 )。

在 Linux 上,如果允許這樣做,當您需要交互式輸入(具有編輯功能和自動完成功能)時,您可以使用GNU readline而不是getline 然后從GNU bash (或RefPerSys ,如果對 C++ 感興趣)的源代碼中獲得靈感。

如果您不熟悉通常的解析技術,請閱讀一本好書,例如龍之書》 大多數大型程序在某處處理解析,因此您需要知道如何完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM