2014-12-03 51 views
1

我試圖從一個字符串中去除的數據,這樣的事情:你如何忽略sscanf中的已知單詞?

char * fromSocket = "GET /test.html HTTP 1.0\n""Host: www.example.com\n""Client: 127.0.0.1:60000\n"; 

在那裏我知道,在這種情況下,「HTTP 1.0」「主持人:」和「客戶端」和之間的分號客戶IP和端口將永遠在那裏。我試圖使用的sscanf()這樣的:

sscanf(conString, "%s %s HTTP 1.0 Host: %s Client: %s:%s", com, loc, hos, cli, port); 

但是當我測試使用此輸出:

printf("%s %s %s %s %s\n", com, loc, hos, cli, port); 

我收到了一堆空值。我如何忽略我知道存在的特定單詞?我在網上查看了一些頁面,但我認爲1.0會拋出掃描儀或其他任何東西。謝謝!

+2

你似乎缺少'[\ r] \ N'和'HTTP/1.0'斜線。使用HTTP解析器! – Ryan 2014-12-03 21:45:42

+0

爲什麼在數據處於fromSocket時查看conString? – user3629249 2014-12-04 01:26:40

+0

進行測試,請務必檢查scanf函數的返回值以確定有多少次轉換成功。我建議先從格式字符串開始獲取第一個'%s',然後從那裏開始工作,直到找到問題。 – user3629249 2014-12-04 01:55:26

回答

4

您只需將這些部分放入您的格式字符串中,並且sscanf將確保它們存在並佔據,但不會將它們讀入任何變量。例如:

sscanf("GET /test.html HTTP 1.0\nHost: www.example.com\nClient: %16[^:]:%d\n", cli, port); 

還要注意的是在scanf格式串中空白(掃描集外)從其他字符處理有點不同 - 而不是指定的字符匹配時,將匹配的任意的空白量(例如,格式字符串中的"\n"可以與輸入數據中的" \t\v \r"匹配)。因此,如果您需要驗證新行是否真的是新行(而不是其他空白行),則需要將它們更改爲類似%*[\n]的行。如果你這樣做,請記住,大多數網絡協議的標準是一個「\ r \ n」序列。

如果你真正的問題是如何允許(例如)www.example.com是一個任意字符串,並且你想確保那裏有一個字符串,但不想將它讀入一個變量,那麼你可以使用有*轉換來讀取,但防止轉換,如:%*s

​​3210
+0

我想如果可以將「GET」,「/test.html」,「www.example.com」,客戶端IP和客戶端端口讀入另一個數據結構中,但即使刪除了新的行字符,我仍然在實際閱讀他們的價值觀時遇到問題。 編輯:沒關係,你是對的。這是我遇到的另一個問題,那就是搞亂了我的輸出。謝啦! – user3107774 2014-12-03 22:03:20

+0

@chux:哎呀 - 挺對的。我很少再使用'scanf',我忘記了這一點。感謝您的提醒;我已經編輯過。 – 2014-12-04 00:34:42