我想从字符串中提取整数,例如我想从字符串“/ dev / nkdev / group0 / mdev1”中提取0作为组标识符,将1作为mdev标识符。
在上面的字符串中,“/ dev / nkdev / group”是输入中的固定模式,group id可以是0-9之间的任何整数,而“mdev”也不是固定的,它可以是任何字符序列后跟一个整数。
我使用了以下代码
#define NO_INTEGER "%0[^0-9]"
res = sscanf(dev_name_p, NO_INTEGER "%u" NO_INTEGER "%u",
&group_id, &mdev_id);
但我发现内核不支持跳过序列。任何机构都可以告诉,如果有任何内核库函数可以完成这项工作吗?
答案 0 :(得分:2)
kstrtoint() - 将字符串转换为int。
kstrtol() - 将字符串转换为long。
您检查linux kernel soruce树中的声明 /include/linux/kernel.h 。您必须包含此头文件 #include<使用此功能之前的linux / kernel.h> 。
Example :
const char *buf = "123";
long value;
if(kstrtoint(buf, 10, &value) != 0)
return -1;
printk("%d",value);
答案 1 :(得分:2)
我在本例中使用的格式字符串应该可以工作:
class A {
B son;
A(): B(this) {}
};
class B {
A* parent;
B(A* myparent): parent(myparent) {}
~B() {
// do not use parent->... because parent's lifetime may be over
parent = NULL; // always safe
}
}
它产生了这个输出:
#include <stdio.h>
int main(void)
{
unsigned a = 38, b = 38; // Default magic value
int n = sscanf("/dev/nkdev/group0/abc1", "/dev/nkdev/group%u/%*[a-z]%u", &a, &b);
printf("n: %i, a: %u, b: %u\n", n, a, b);
return 0;
}
答案 2 :(得分:-1)
此解决方案在用户空间中运行,但此处使用的所有函数在内核空间中都可用,结果相同
很脏,但它会起作用:
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char string[] = "/dev/nkdev/group4/mdev12";
char *stringp = (char *)&string;
const char delimiters[] = "/";
char *token;
int num1, num2;
token = strsep (&stringp, delimiters); /* token => "" */
token = strsep (&stringp, delimiters); /* token => "dev" */
token = strsep (&stringp, delimiters); /* token => "nkdev" */
token = strsep (&stringp, delimiters); /* token => "group0" */
while (*token != 0 && (*token < '0' || *token > '9'))
token++;
num1 = strtol(token, NULL, 10);
token = strsep (&stringp, delimiters); /* token => "mdev1" */
while (*token != 0 && (*token < '0' || *token > '9'))
token++;
num2 = strtol(token, NULL, 10);
printf("num1: %d\nnum2: %d\n", num1, num2);
}