2012-12-05 67 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

相关问题