3

我正在为我正在制作的程序使用 AT 命令,并且无法使用 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;

为什么它不返回我请求的字符串?我究竟做错了什么?

预先感谢您的帮助。

4

2 回答 2

1

也许问题在于如何sscanf处理空格字符,例如回车和换行符,以及您的期望。sscanf需要忽略(跳过)前面的空白。

另一个问题可能是回车永远不会到达您的缓冲区。C 实现需要映射\r\n\n输入(对于文本流)。

于 2012-12-05T15:23:59.843 回答
0

我们来分析一下格式:

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

首先,跳过'\r'​​或字符的初始序列( )。然后扫描以下字符直到下一个字符并存储到( ) 中。'\n'%*[\r\n]'\r'new_buffer%[^\r]

接下来,将跳过所有后续的空白字符 ( \r)。至 的部分'O'现已"OK"消耗。

然后,忽略下一个换行符之前的所有字符 ( %*[^\n])。您现在只剩下最后一个未使用的换行符。然后将消耗的字符数存储在count.

您的问题是格式字符串中的任何空格(当然是字符集之外的)都会消耗出现在该位置的整个空格字符序列(可能是空的)。格式字符串中的\r不是“一个字符'\r'”,而是“这里的所有空格”。

您可以通过使其扫描(并忽略)任何字符来修复它(如果您的格式是严格的)('\r'如果您的输入确实是您所期望的,那么在您的情况下保证是 a 。

sscanf(buffer + index, "%*[\r\n]%[^\r]%*c%*[\n]%n", new_buffer, &count);
于 2012-12-05T15:56:27.250 回答