如何从Linux内核空间中的字符串中提取整数?

时间:2016-06-21 11:33:32

标签: c linux-kernel linux-device-driver

我想从字符串中提取整数,例如我想从字符串“/ 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);

但我发现内核不支持跳过序列。任何机构都可以告诉,如果有任何内核库函数可以完成这项工作吗?

3 个答案:

答案 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);
}