C:转换模块中的双精度字符串(又称内核中)
-
12-12-2019 - |
题
我很想使用过时的“atoi”之类的东西,但事实证明我在内核空间中没有它。
我的模块的 write 方法中有这段代码。写入由我在用户空间中控制,并且用户总是会以这种格式写入内容:
"0.9 9.5 7.6 "
因此 - 我有这段代码来解析它:
ssize_t write_info( struct file *filp, const char __user *buff, unsigned long len, void *data )
{
char *seedid;
char *low_in;
char *high_in;
char *dropper;
unsigned long long seedid_var;
double d_1;
double d_2;
printk(KERN_INFO "Whaddup u writin'?\n");
dropper = kstrdup(buff, 0);
seedid = strsep(&dropper, " ");
printk("HERE IS: %s\n\n", seedid);
sscanf(seedid, "%lld", &seedid_var);
printk("AND BACK AGAIN: %lld\n\n\n", seedid_var);
low_in = strsep(&dropper, " ");
printk("HERE IS: %s\n\n", low_in);
sscanf(low_in, "%f", &d_1);
printk("AND BACK AGAIN: %f\n\n", d_1);
high_in = strsep(&dropper, " ");
printk("HERE IS: %s\n\n", high_in);
sscanf(high_in, "%f", &d_2);
printk("AND BACK AGAIN: %f\n\n", d_2);
...
然后,我通过在它创建的 procfile 上进行 echo 来触发我的模块(调用我的 write 方法),如下所示:
echo "0.9 9.8 3.4 " > name_of_my_proc
使用 dmesg:
[ 2211.808474] Whaddup u writin'?
[ 2211.808505] HERE IS: 0.9
[ 2211.808508]
[ 2211.808514] AND BACK AGAIN: 0
[ 2211.808516]
[ 2211.808517]
[ 2211.808520] HERE IS: 9.8
[ 2211.808522]
[ 2211.808524] AND BACK AGAIN: %f
[ 2211.808526]
[ 2211.808529] HERE IS: 3.4
[ 2211.808531]
[ 2211.808533] AND BACK AGAIN: %f
当打印回内核时......没有任何效果像我想要的那样!我的 0.9 被杀死为 0(这不是一个合法的 long long 值,如果是这样那就有意义了)。最重要的是,我的双打没有被转换 - 它只是打印字符 %f。我该怎么做才能让它们在我打字时打印出来?
谢谢
解决方案
您使用了错误的扫描码。
Scan code: Data type:
%d int
%ld long
%f float
%lf double
另请注意 long long
是整数数据类型,不能存储小数。
不隶属于 StackOverflow