gpt4 book ai didi

c - 为什么 sscanf 不适用于这种情况?

转载 作者:行者123 更新时间:2023-11-30 15:28:34 25 4
gpt4 key购买 nike

目前我正在读取文件,并打印(标准输出)它包含的所有单词/字符串。

这是代码:

int scan_strings(FILE *in, FILE *out) 
{
char buffer[64];
int i = 0, n = 0;

for(;;)
{
if (fscanf(in, "%*[^" charset "]") != EOF)
{
i = 0;
while (fscanf(in, "%63[" charset "]%n", buffer, &n) == 1)
{
if (n < 4 && i == 0)
{
break;
}
else
{
i = 1;
}

fputs(buffer, out);
}
if (i != 0)
{
putc('\n', out);
}
}
if (feof(in))
{
return 0;
}
if (ferror(in) || ferror(out))
{
return -1;
}
}
}

但是我想做的是从已经读入内存的缓冲区中搜索字符串。

我将 inout 变量更改为 unsigned char* 并将 fscanf 更改为 sscanf。然而那是行不通的。我是否误解了 sscanf 函数,或者我的代码中还有其他问题吗?

如何打印已读取缓冲区中的所有字符串?数据是二进制数据。

我正在 Windows 上工作,不需要 Linux 可移植性。

最佳答案

sscanf(data, "%*[^"charset "]")fscanf(in, "%*[^"charset "]") 的工作方式不同。当数据是二进制时。

假设charset是一些字符串,如“123”。

fscanf(in, "%*[^123]") 只要读取的 char 不是 就会扫描 in >'1''2''3'
包括'\0'

sscanf(data, "%*[^123]") 只要读取的 char 不是 就会扫描 data >'1''2''3'
不包括'\0',因为sscanf停止提供char扫描一次'\0 '遇到了

无法使用 sscanf() 扫描 '\0'

<小时/>

[编辑]

OP:我应该如何去做 - 对于二进制数据(来自缓冲区/变量)?
答:sscanf() 周围的附加代码可用于处理遇到 '\0' 时停止扫描的情况。就像第一个 sscanf() 一样:

size_t j=0;
for (;;) {

// if (fscanf(in, "%*[^" charset "]") != EOF)
while (j < datasize) {
int n = 0;
sscanf(&data[j], "%*[^123]%n", &n);
if (n > 0) j += n;
else if (data[j] == '\0') j++;
else break;
}

if (j < datasize) {
i = 0;
...

如您所见,事情变得越来越难看。
让我们尝试将 strchr() 与未经测试的代码一起使用:

size_t j=0;
for (;;) {

while (j < datasize) {
int ch = data[j];
if (ch && strchr(charset, ch) != NULL) break;
j++;
}

if (j < datasize) {
i = 0;
...

变得更好,这仅适用于第一个 sscanf()

关于c - 为什么 sscanf 不适用于这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532820/

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