sscanf无法匹配字符串

时间:2015-07-18 20:38:18

标签: c

我只是在做一个非常简单的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)就在那里。我做了什么明显的错误?

2 个答案:

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

的字符