【问题标题】:sscanf returns 1 despite the line not matching the search pattern尽管该行与搜索模式不匹配,sscanf 仍返回 1
【发布时间】:2016-04-06 15:55:33
【问题描述】:

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

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 中。我不理解这种行为,因为这一行与我的搜索模式不匹配。

我的代码有什么问题?

我的理解

【问题讨论】:

  • 20 是两个chars,而不是一个。 \n 也是 char。注意:\n 是格式字符串,指示sscanf 扫描任何个空白字符,包括无,直到第一个非空白字符。
  • if(sscanf(buf, " character %c", &val)==1){
  • @BLUEPIXY 空格是否包含制表符?如果任何其他字符或字符串或整数在正确字符后面,我的程序应该打印错误消息,这就是为什么我尝试像这样编写我的搜索模式。据我所知,您的代码会忽略正确字符之后的任何字符,并且在这种情况下不会打印错误。
  • "空格是否包含制表符?" -- 是。事实上,它包含了所有的空白字符' ''\f''\n''\r''\t''\v'
  • @JWH 见DEMO

标签: c parsing scanf


【解决方案1】:

我不理解这种行为,因为该行与我的搜索模式不匹配。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2017-03-17
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多