[英]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;
}
}
}
但是我想做的是从已经读到内存的缓冲区中搜索字符串。
我将in
和out
变量更改为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.