我需要从文件中读取某些参数。我的问题是扫描文件的行来查找参数。文本文件的结构如下:
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
中。我不明白这种行为,因为这一行与我的搜索模式不符。
我的代码出了什么问题?
我对我的了解
答案 0 :(得分:1)
我不明白这种行为,因为这一行与我的搜索模式不符。
*scanf
函数不首先检查模式,然后如果匹配,则填写值。他们一次检查一个字符,并指出他们能够使用的格式字符串中有多少个字段。
不幸的是,在您的情况下,%c
肯定可以匹配'\n'
。后续%*[ \t]
失败,后续\n
失败,但由于这些都未存储在任何地方,因此不会影响sscanf
的返回值,因此,您无法从结果中判断是否存在任何错误。
解决此问题的最简单方法可能是根本不使用*scanf
函数。您可以使用自定义例程轻松描述输入格式,但使用格式字符串则不容易。