【问题标题】:Using format specifiers on Linux system call write()在 Linux 系统调用 write() 上使用格式说明符
【发布时间】:2017-10-11 20:43:46
【问题描述】:

我正在尝试仅使用手册第 2 节 (http://man7.org/linux/man-pages/dir_section_2.html) 中描述的 Linux 系统调用写入标准输出。

ssize_t write(int fd, const void *buf, size_t count);

是我正在尝试使用的功能,但是我正在尝试将格式说明符合并到缓冲区中。理想情况下,它会像这样工作:

char *adjective = argv[1];
write(1, "This is a %s example\n", adjective, 19 + strlen(adjective));

但我显然不能这样做。我将如何去做类似的事情?

另外,我知道 strlen() 不是 Linux 系统调用第 2 节的一部分。为简单起见,我将其包括在内,因为计算缓冲区的长度不是我的问题的一部分。

【问题讨论】:

    标签: linux format system specifier


    【解决方案1】:

    使用sprintf() 格式化成一个缓冲区,然后写入:

    char buffer[BUFSIZE];
    int size = snprintf(buffer, BUFSIZE, "This is a %s example\n", adjective);
    write(STDOUT_FILENO, buffer, strlen(buffer));
    

    如果你不能使用sprintf(),就单独写每个字符串。

    write(STDOUT_FILENO, "This is a ", sizeof "This is a ");
    write(STDOUT_FILENO, adjective, strlen(adjective));
    write(STDOUT_FILENO, " example", sizeof " example");
    

    【讨论】:

    • 很遗憾,对于这个作业,我不能使用 snprintf(),因为它不在 Linux 手册的第 2 节中。
    • 那么你不能使用格式说明符,它们是printf()函数家族的一部分。
    • 明白了!我开始怀疑我做不到。谢谢!
    • 您确定必须使用格式说明符吗?如果你这样做了,听起来你应该实现自己的printf() 版本。
    • 一个示例字符串包括格式说明符的使用,(""在 %d 个处理器上执行 \"%s\" 的 %d 个副本所用的时间是 %7.3fsec\n")和非-功能要求声明我只能使用手册第 2 节中的 Linux 系统调用。
    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多