0

我想知道如何使用 strstrip 内核函数将像“hello world”这样的字符串解析为“helloworld”。我正在开发一个 Linux Kernel char 设备,这个功能导致我出现 Kernel Panic(或 Kernel Opss)。

我使用此功能的方式如下:

char result[100];

strcpy(result, "hello world");
strstrip(result);
strstrip(&result); //Also tried this
strstrip("100+200"); //Also tried this

一旦执行 strstrip 行,就会导致内核错误。调用此函数的正确方法是什么?

4

2 回答 2

1

实际上 strstrip 有助于删除前面的空白。它不会删除字符串中的所有空格。请看下面的例子。

char result[100];
strcpy(result, "     hello world from stack exchange");
printk("\n before: %s",result);
strcpy(result, strstrip((char*)result));
printk("\n after: %s",result);

希望能帮助到你。

于 2013-09-27T14:09:49.427 回答
1

srtstrip() 是现代内核中 srim() ( http://lxr.linux.no/linux+v3.11.2/lib/string.c#L361 ) 的包装函数。由于它将尝试修改字符串本身,因此您不能像第三次尝试那样使用静态字符串调用它。

您的第二次尝试是将指针传递给数组变量,该数组变量也是一个指针。因此,您传递了一个 char**,如果您查看上面的链接,您会发现它是不正确的。

第一次尝试不应导致内核错误,但您似乎没有在 a 局部变量中接收返回值。你收到什么样的错误?如果您可以提供该信息,我将更新此答案。

最后,正如 Balamurugan A 指出的那样,这个功能并没有像你想象的那样做。strsep() ( http://lxr.linux.no/linux+v3.11.2/lib/string.c#L485 ) 可能会帮助你,但它只是删除所有空格的垫脚石。实际上,您必须逐字将字符串复制到新的缓冲区中,因为没有办法简单地“转移内存内容”。

于 2013-09-27T15:43:03.277 回答