用sscanf控制整个管柱

用sscanf控制整个管柱,c,parsing,scanf,C,Parsing,Scanf,我需要用以下格式“foo=%d”解析c中的字符串,我需要检查格式是否正确并读取int值 我最初的代码是: int foo_set = 0; int foo; if (sscanf(text, "foo=%d", &foo) == 1) foo_set = 1; 但是代码应该拒绝输入,例如“foo=5$%”。 这个代码行吗 int foo_set = 0; int foo; char control; if (sscanf(text, "foo=%d%c", &foo,

我需要用以下格式“foo=%d”解析c中的字符串,我需要检查格式是否正确并读取int值

我最初的代码是:

int foo_set = 0;
int foo;
if (sscanf(text, "foo=%d", &foo) == 1)
    foo_set = 1;
但是代码应该拒绝输入,例如“foo=5$%”。 这个代码行吗

int foo_set = 0;
int foo;
char control;
if (sscanf(text, "foo=%d%c", &foo, &control) == 1)
    foo_set = 1;
使用
控件
字符检查代码是否没有额外的输入。 有没有更好/更正确的方法


谢谢

使用
%n
格式说明符确定处理结束的位置,并检查它是否与字符串长度匹配:

const char* text = "foo=4d";
int pos;
int foo;

if (sscanf(text, "foo=%d%n", &foo, &pos) == 1 &&
    pos == strlen(text))
{
    /* Valid as all of text consumed. */
}
C99标准中格式说明符
n
的说明:

没有消耗任何输入相应的参数应是指向 要写入从中读取的字符数的有符号整数 到目前为止,调用fscanf函数的输入流。执行 %n指令不增加在 完成fscanf功能的执行。不转换任何参数, 但有一个被消耗掉了。如果转换规范包括赋值 字符或字段宽度,行为未定义


请参见位于的演示。

此代码是否有效?
。为什么不运行并查看呢?我不知道这有多正确或最新,但根据Linux
scanf
手册:
C标准说:“执行%n指令不会增加执行完成时返回的赋值计数”,但勘误表似乎与此相矛盾。可能明智的做法是不要对%n转换对返回值的影响进行任何假设。