sscanf和多个%ms

时间:2017-08-25 07:14:47

标签: c scanf

sscanf()在格式字符串中获得两个“%ms”时。 当sscanf()返回0或1时,为两个目标指针调用free()是否安全?就像在下一个函数中一样:

void foo(const char* text)
{
    char* key = NULL;
    char* value = NULL;

    int count = sscanf(text, "%ms %ms", &key, &value);

    if (count == 2)
    {
        ...
    }

    free(key);
    free(value);
}

或者后面的目标指针(value)是否有一些垃圾值? 并且需要进行以下清理:

void bar(const char* text)
{
    char* key = NULL;
    char* value = NULL;

    int count = sscanf(text, "%ms %ms", &key, &value);

    if (count == 2)
    {
        ...
        free(key);
        free(value);
    }
    else if (count == 1)
    {
        free(key);
    }
}

1 个答案:

答案 0 :(得分:4)

首先,您应该知道转化规范中的m 非标准,因此您应该考虑使用它两次:您的代码将是不可移植的。

但是,如果您的实施支持m,只要您将指针初始化为0 / NULL,此用法就是安全。当scanf()被指定为 no op (它总是安全的)时,free(0)永远不会触及任何内容。