2012-12-05 64 views
3

我對我正在使用的程序使用AT命令,並且無法使用sscanf()函數解析它們。似乎無法讓sscanf()以我想要的方式工作

舉例來說,如果我拿這個命令:

"AT\r\r\nOK\r\n" 

我想: *在第一個呼叫,只得到「AT」的一部分,扔掉下面的「\ R」字符,知道到目前爲止已經讀了多少個字符。 *在第二次調用時,只獲取「OK」部分,丟棄在「OK」字符串之前和之後出現的「\ r \ n」字符,並知道到那時已讀取了多少個字符。

我寫了下面的sscanf函數調用:

index = 0; 
sscanf(buffer + index, "%*[\r\n]%[^\r]\r%*[\n]%n", new_buffer, &count); 
index += count; 

爲什麼不還給我要求的字符串?我究竟做錯了什麼?

非常感謝您的幫助。

回答

0

讓我們分析格式:

sscanf(buffer + index, "%*[\r\n]%[^\r]\r%*[\n]%n", new_buffer, &count); 

首先,'\r''\n'字符的初始序列被跳過(%*[\r\n])。然後掃描下列字符,直到下一個'\r'被掃描並存儲到new_buffer%[^\r])。

接下來,跳過所有跟隨的空白字符(\r)。 "OK"'O'部分現在已被消耗。

然後,忽略直到下一個換行符的所有字符(%*[^\n])。你現在只剩下最後一個沒有被使用的換行符。然後,消耗的字符數存儲在count中。

你的問題是格式字符串(當然是外部字符集)中的任何空格都會佔用整個序列(可能爲空),該序列出現在那個地方。格式字符串中的\r並不意味着「一個字符'\r'」,它表示「此處所有空白」。

你可以通過使掃描修復它(如果你的格式是剛性的)(和忽略)的任何字符(而你的情況是保證一個'\r'如果輸入真的是你所期望的。

sscanf(buffer + index, "%*[\r\n]%[^\r]%*c%*[\n]%n", new_buffer, &count); 
+0

感謝丹尼爾的幫助。 我不同意你寫的一些東西。我同意你寫的第一段。但是,在第二段中,我不認爲(\ r)會使函數跳過所有跟在空白字符後面的字符。它只是讓它跳過一個\ r字符。這就像寫作:sscanf(緩衝區,「%* [^:]:」,它只會跳過一個':'字符,而不是所有的字符。 然後我添加了(%* [^ \ n])部分是因爲某些命令行以「\ r」結尾,有些以「\ r \ n」結尾,我想跳過這兩個文件。 – LinkOfTime

+0

問題在於,令牌末尾的%n會將count ,並且什麼都不讀入到new_buffer。 – LinkOfTime

+0

好的,我再次測試了它,並且我同意你的說法。它確實對待'\ r'字符與':'字符不同。問題是,我該如何解決它? 例如,在這樣的文字: 「AT \ r \ r \ NOK \ r \ n」 個 我希望它讀 「AT \ r」 第一次和「\ r \ NOK \ r \ n「,我怎樣才能將'\ r'與後面的'\ r \'分開? – LinkOfTime

1

也許問題是sscanf如何處理空格字符,如回車符和換行符,以及您的期望。 sscanf需要忽略(略過)前面的空格。

另一個問題可能是回車從未將它送到緩衝區。 C實現需要在輸入(對於文本流)上將\r\n映射到\n

+0

首先,我想感謝你的幫助延斯 我不認爲sscanf()對待回車或換行符不同於任何普通字符雖然.. 此外,內容使它成爲上面寫的緩衝區(我在閱讀你的回覆後檢查了緩衝區的內容)。 不知道它可能是什麼..我傳遞給函數的令牌似乎沒問題,對吧? – LinkOfTime

相關問題