在C语言中解析一行以同时包含字符和两位数

在C语言中解析一行以同时包含字符和两位数,c,parsing,C,Parsing,我有一个输入文件,其中有一行: e 45 我需要一种方法将数字“45”设置为名为value的int变量。 我已经试过了 sscanf(inputfile, " %d", &value); 但价值是不变的。 我使用的功能是否错误?您使用的: 有两点是错误的。首先,sscanf不从文件流中读取(大概是inputfile引用的),相反,sscanf的原型是: int sscanf(const char *str, const char *format, ...); 其中第一个参数是cons

我有一个输入文件,其中有一行:

e 45

我需要一种方法将数字“45”设置为名为value的int变量。 我已经试过了

sscanf(inputfile, " %d", &value);
但价值是不变的。 我使用的功能是否错误?

您使用的:

有两点是错误的。首先,
sscanf
不从文件流中读取(大概是
inputfile
引用的),相反,
sscanf
的原型是:

int sscanf(const char *str, const char *format, ...);
其中第一个参数是
const char*
,它解析缓冲区中的信息(您很可能会调用
fgets
从文件中读取信息)

其次,对于字符串
“e 45”
,尝试使用
“%d”
进行解析会导致匹配失败,因为当
“%d”
转换说明符遇到非数字时,转换失败,从输入缓冲区提取字符停止,调用失败

相反,您需要先删除
“45”
之前的所有非数字字符,然后再尝试使用
“%d”
进行分析。您可以使用求反字符类和赋值抑制运算符(例如,
'*'
)和
“%*[^0-9]%d”
来实现这一点,这将导致
sscanf
跳过前导空格(这是不需要的),并将读取和丢弃所有非数字(使用
'
跳过前导空格是多余的)使用
“%*[^0-9]”
“^”
扬抑符会导致
“[…]”
)中字符匹配的否定,然后最后使用
“%d”
解析整数值

一个简单的例子是:

#include <stdio.h>

int main (void) {

    char *s = "e 45";
    int n;

    if (sscanf (s, " %*[^0-9]%d", &n) != 1) {
        fputs ("error: invalid format.\n", stderr);
        return 1;
    }

    printf ("n: %d\n", n);

    return 0;
}

仔细检查一下,如果您还有其他问题,请告诉我。

if(sscanf(第%*[^0-9]%d行,&value)!=1){/*处理错误*/}
注意:
sscanf
解析
char*
缓冲区,而
fscanf
解析文件流中的输入。请显示相关代码,而不是对
sscanf
的假设调用。请说明遇到错误的位置。另请参见。
“%*[^0-9]%d”
将吃掉整数的符号-可能对OP不重要。是的,这是一个无法通过
sscanf
解决的难题。使用
“e-f-45”
,您只需获得
45
。这一点很好,但为了补救,需要迭代缓冲区并检查当前和下一个字符,然后调用
strtol
。。。
#include <stdio.h>

int main (void) {

    char *s = "e 45";
    int n;

    if (sscanf (s, " %*[^0-9]%d", &n) != 1) {
        fputs ("error: invalid format.\n", stderr);
        return 1;
    }

    printf ("n: %d\n", n);

    return 0;
}
$ ./bin/sscanfn
n: 45