如何sscanf确保缓冲区正是我想要的?

时间:2016-05-08 17:09:22

标签: c parsing scanf eol

我想sscanf一行,并确保没有什么比我想要的更多了。代码如下所示:

void parse_init_command(char *buffer, command *new_command) {
    if (sscanf(buffer, 
        "%s %d %d %d %d %d %d %d\n",
        new_command->name,
        &new_command->data[0],
        &new_command->data[1],
        &new_command->data[2],
        &new_command->data[3],
        &new_command->data[4],
        &new_command->data[5],
        &new_command->data[6]) != 8) {
        strncpy(new_command->name, "WRONG_INPUT", 15);
    }
}

当我收到如下输入时:

INIT 9 11 3 1 1 1 9

一切都很好,但接下来是这样的输入

INIT 9 11 3 1 1 1 9 s

也被接受。我想如果我添加“\ n”,一切都会正常工作,因为我知道每个输入行都以EOL结尾,但事实并非如此。

1 个答案:

答案 0 :(得分:2)

如果你的输入总是在最后有一个换行符,这样的东西就可以做到。该代码需要一个额外的char类型,并检查它是\n,以及扫描的正确项目数。它会打印1以获得成功 - 就本例而言,您的功能略有不同。

#include <stdio.h>

typedef struct {
    char name[100];
    int data[7];
} command;

int parse_init_command(char *buffer, command *new_command) {
    char eol = 0;
    int num = sscanf(buffer, "%s%d%d%d%d%d%d%d%c",
                                new_command->name,
                                &new_command->data[0],
                                &new_command->data[1],
                                &new_command->data[2],
                                &new_command->data[3],
                                &new_command->data[4],
                                &new_command->data[5],
                                &new_command->data[6],
                                &eol);
    return num == 9 && eol == '\n';
}

int main(void)
{
    char inp[50];
    command rec;
    fgets(inp, sizeof inp, stdin);
    printf("%d\n", parse_init_command(inp, &rec) );
    return 0;
}

来自键盘的程序会话:

INIT 9 11 3 1 1 1 9
1

INIT 9 11 3 1 1 1 9 s
0

请注意%c之前没有前导空格会导致空格被跳过,从而无法获得空格。