如何在 utmp.h 中打印 utmp 结构的数据?

How do you print utmp struct's data in utmp.h?

我想学习使用utmp.h自带的函数和数据结构。 在下面的代码中,我想遍历 utmp 结构并打印它们的数据字段。

#include <stdio.h>
#include <utmp.h>

int main()
{
        struct utmp *data;
        data = getutent();
        int i = 0 ;
        while(data != NULL)
        {
                ++i;
                printf("%s\n" , data->ut_id);
                data = getutent();
        }
        printf("%d" , i);
        return 0 ;
}

即使 ut_idchar[4] 类型,当我 运行 代码时,我收到此警告:

警告:“__builtin_puts”参数 1 声明的属性“非字符串”[-Wstringop-overflow=]

我该如何解决?

此警告是 gcc 特定属性 __attribute_nonstring__ 的结果,该属性用作字符数组不一定以 NUL 字符结尾的指示符,因此可能不会可以安全地与标准库字符串函数一起使用。 Linux 中的 utmp 结构在其字符数组字段上使用该属性定义。

要解决该警告,您可以使用 printf() 修饰符 %.*s 指定字符数组的固定宽度输出,如下所示:

printf("%.*s\n" , (int)(sizeof data->ut_id), data->ut_id);

(您可以只使用 4 作为第二个参数,但 sizeof 更灵活)。