gpt4 book ai didi

c - 从 sscanf 发出读取

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:10 26 4
gpt4 key购买 nike

这一切可能真的很简单,但我遗漏了一些东西,希望你能提供帮助。好的,这是我的问题,尽可能简单。

我在使用 USB 设备后从 readfile 返回一个缓冲区。这一切工作正常,我可以通过使用像这样的循环将缓冲区放好

for (long i=0; i<sizeof(buffer); i++)  //for all chars in string
{
unsigned char c = buffer[i];

switch (Format)
{
case 2: //hex
printf("%02x",c);
break;
case 1: //asc
printf("%c",c);
break;
} //end of switch format
}

当我使用文本 (%c) 版本时,我可以按照我预期的方式在屏幕缓冲区中看到数据。然而,我的问题是当我使用 sscanf 阅读它时。我使用 strstr 搜索缓冲区中的一些键并使用 sscanf 检索它的数据。但是,sscanf 失败了。可能是什么问题?

下面是我用来扫描缓冲区的代码示例,它在这个独立版本中运行良好。无法读取上述代码中的缓冲区部分。尽管我可以用 printf 看到它。

#include <stdio.h> 
#include <string.h>
#include <windows.h>

int main ()
{
// in my application this comes from the handle and readfile
char buffer[255]="CODE-12345.MEP-12453.PRD-222.CODE-12355" ;
//
int i;
int codes[256];
char *pos = buffer;
size_t current = 0;
//
while ((pos=strstr(pos, "PRD")) != NULL) {
if (sscanf(pos, "PRD - %d", codes+current))
++current;
pos += 4;
}

for (i=0; i<current; i++)
printf("%d\n", codes[i]);
system("pause");
return 0;
}

谢谢

最佳答案

问题是,您的 ReadFile 在您感兴趣的数据之前为您提供了不可打印的字符,特别是在开头的 '\0' 中。由于 C 中的字符串以 NUL 结尾,所有标准函数都假定缓冲区中没有任何内容。

我不知道您正在阅读的到底是什么,但也许您正在阅读包含标题的邮件?在这种情况下,您应该先跳过 header 。

盲目尝试解决问题,可以手动跳过坏字符,假设它们都在开头。

首先,让我们确保缓冲区始终以 NUL 结尾:

char buffer[1000 + 1];    // +1 in case it read all 1000 characters
ReadFile(h,buffer,0x224,&read,NULL);
buffer[read] = '\0';

然后,我们知道ReadFile填充了read个字节。我们首先需要从那里回过头来找出好的数据从哪里开始。然后,我们需要进一步回溯,找到第一个数据不感兴趣的地方。请注意,我假设消息末尾没有可打印字符。如果有,那么这会变得更加复杂。在这种情况下,最好编写自己的 strstr,它不会在 '\0' 处终止,而是读取给定的长度。

所以代替

char *pos = buffer;

我们做

// strip away the bad part in the end
for (; read > 0; --read)
if (buffer[read - 1] >= ' ' && buffer[read - 1] <= 126)
break;
buffer[read] = '\0';
// find where the good data start
int good_position;
for (good_position = read; good_position > 0; --good_position)
if (buffer[good_position - 1] < ' ' || buffer[good_position - 1] > 126)
break;
char *pos = buffer + good_position;

其余的可以保持不变。

注意:我从数组的后面开始,因为假设开头是标题,那么它可能包含可能被解释为可打印字符的数据。另一方面,最后它可能全为零或其他东西。

关于c - 从 sscanf 发出读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com