繁体   English   中英

为什么sscanf在这种情况下不起作用?

[英]Why sscanf does not work for this situation?

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

这是代码:

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]")将扫描in作为长char读不是'1' '2''3'
包括 '\\0'

只要读取的char不是'1''2''3'sscanf(data, "%*[^123]")就会扫描data
不包括 '\\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()

问题是您的代码永远不会in修改。 in一个文件中fscanf将通过它按顺序移动。 但是sscanf不能那样工作。

你需要找出多少个字符如何sscanf阅读,然后增加in相应。

您已经在n读取了字节n ,因此只需将其添加到in

 in += n;

...在sscanf之后

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM