C语言 在kernel.h的sscanf中不工作的字符串修饰符


#include <linux/kernel.h> //sscanf
int err;
char a[32];
char b[32];
char c[32];
char test[20]="add abc de";
char *p=test;
err=sscanf(p,"%s %[^tn] %s",a,b,c);
printk("%d Data correctly parsed %s %s %s",err,a,b,c);

打印下列内容,而不是数组中的字符串:

xfffffff4saxffffff82xffffffffxffffffffxffffffffxffffffff

问题是第二个修饰符,如果我使用正常的%s,它可以工作。我想将两个单词之间的所有单词存储在一个字符串中。例如:delete a b c fromTable存储a b c的字符串

上面的代码可以与C库中的sscanf一起使用,但不能与kernel.h

中的sscanf一起使用。

函数sscanf返回匹配的项数。返回值1表示只分配了第一个参数a

%[...]说明符的支持仅在4.6版本中出现:https://elixir.bootlin.com/linux/v4.6-rc1/source/lib/vsprintf.c#L2736。它们提供以下警告:

/*
* Warning: This implementation of the '[' conversion specifier
* deviates from its glibc counterpart in the following ways:
* (1) It does NOT support ranges i.e. '-' is NOT a special
*     character
* (2) It cannot match the closing bracket ']' itself
* (3) A field width is required
* (4) '%*[' (discard matching input) is currently not supported
*
* Example usage:
* ret = sscanf("00:0a:95","%2[^:]:%2[^:]:%2[^:]",
*      buf1, buf2, buf3);
* if (ret < 3)
*    // etc..
*/

除其他事项外,该警告表明说明符%[..]要求一个字段的宽度。在你的代码中,你没有提供这个宽度,所以参数b不能被解析。

相关内容

  • 没有找到相关文章

最新更新