在C语言中解析一行以同时包含字符和两位数
我有一个输入文件,其中有一行: e 45 我需要一种方法将数字“45”设置为名为value的int变量。 我已经试过了在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
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