我只是在做一个非常简单的sscanf并且它失败了,我不知道为什么(我是C的初学者)。
我相信它应该有用,我会为此疯狂...
以下是代码示例:
int rval; // return value
char* buf;
char* file = "/proc/stat";
long unsigned int intr=0, introld=0;
buf=file2buf(file);
if((rval=sscanf(buf, "intr %lu", &introld)) < 1) perror("ERROR");
printf("buffer: %s\nintrold: %lu\n", buf, introld);
free(buf);
以下是打印出来的内容:
错误:成功
缓冲区:cpu 1226442 3373 193292 19167181 57056 3 154 0 0 0
cpu0 323691 790 47844 4778847 9693 0 62 0 0 0
cpu1 290857 1430 42436 4804284 20607 0 25 0 0 0
cpu2 326087 608 57761 4763973 10862 2 40 0 0 0
cpu3 285805 544 45249 4820075 15893 0 25 0 0 0
intr 48727278 36 26655 0 0 0 0 0 0 1 11277 0 0 3788861 0 0 0 70288 0 0 2 0 0 0 33 0 0 443731 0 25936 1429307 25 893 2807619
introld:0
显然匹配的字符串(intr)就在那里。我做了什么明显的错误?
答案 0 :(得分:3)
scanf
family of functions不进行常规模式匹配,它会尝试将输入完全匹配,这意味着您传递给sscanf
的字符串必须开始< / em> "intr"
,以便能够匹配。
您应该考虑从文件中逐行阅读并尝试使用例如strncmp
然后在匹配的行上调用sscanf
。或者可能会查找正则表达式库。
答案 1 :(得分:2)
问题是你的缓冲区。它包含&#39; cpu ... blah blah
&#39;。
要使sscanf正常工作,缓冲区必须仅以intr
开头。
或者 - 正如其他评论中所建议的那样 - 你必须修改sscanf
函数中传递的字符串,以便提取intr
之后的字符串并将其传递给sscanf。 (即没有cpu +额外的guff - AND without intr)尝试简单地将数字(包含数字的字符串)传递给sccanf
,而不强迫它进行字符匹配。
您可以使用p=strstr(buf,"intr")
,然后使用sscanf(p+5,"&lu"...)
... p + 5将跳过&#39; intr&#39;