尽管行与搜索模式不匹配,但sscanf返回1

时间:2016-01-02 15:13:26

标签: c parsing scanf

我需要从文件中读取某些参数。我的问题是扫描文件的行来查找参数。文本文件的结构如下:

character *\n

因此每一行都必须具有模式(space or tab)character[space or tab][char][space or tab]\n

开头的空格或制表符是可选的。我尝试用

做到这一点
char val;
if(sscanf(buf, "%*[ \t]character%*[ \t]%c%*[ \t]\n",&val)==1||sscanf(buf, "character%*[ \t]%c%*[ \t]\n",&val)==1){
    printf("%c in %i\n", val,line);
}else{
    fprintf(stderr,"Error while reading line %i\n",line);
}

buf包含当前行。

我的问题是,在像character \n这样的行中,我的程序不会输出错误。相反,它会将'\n'保存在val中。我不明白这种行为,因为这一行与我的搜索模式不符。

我的代码出了什么问题?

我对我的了解

1 个答案:

答案 0 :(得分:1)

  

我不明白这种行为,因为这一行与我的搜索模式不符。

*scanf函数不首先检查模式,然后如果匹配,则填写值。他们一次检查一个字符,并指出他们能够使用的格式字符串中有多少个字段。

不幸的是,在您的情况下,%c肯定可以匹配'\n'。后续%*[ \t]失败,后续\n失败,但由于这些都未存储在任何地方,因此不会影响sscanf的返回值,因此,您无法从结果中判断是否存在任何错误。

解决此问题的最简单方法可能是根本不使用*scanf函数。您可以使用自定义例程轻松描述输入格式,但使用格式字符串则不容易。