似乎无法让sscanf()以我想要的方式工作

时间:2012-12-05 15:19:26

标签: c scanf

我正在使用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;

为什么不返回我要求的字符串?我做错了什么?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

另一个问题可能是回车从未进入缓冲区。需要C实现在输入(用于文本流)上将\r\n映射到\n

答案 1 :(得分: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'。) p>

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