【问题标题】:Spacing of fprintf in CC中fprintf的间距
【发布时间】:2013-03-10 06:41:43
【问题描述】:

这是我正在处理的代码部分:

void update_log(char *name, pthread_t ID, char *status, char *update)
{
    time(&rawtime);
    time_str = asctime(localtime(&rawtime));
    time_str[strlen(time_str) - 1] = 0;
    fprintf(log_file, "[%s]  [%12s]  [%u]  [%s]  %s\n", time_str, name, (unsigned int)ID, status, update);
}  

输出是:

[Sat Mar  9 21:36:20 2013]  [        main]  [197777152]  [OK]  ******
[Sat Mar  9 21:36:20 2013]  [update_table]  [172680960]  [OK]  **********
[Sat Mar  9 21:36:22 2013]  [update_table]  [172680960]  [OK]  ******
[Sat Mar  9 21:36:25 2013]  [        main]  [197777152]  [OK]  ****************

有没有办法让 name 变量的输出看起来像这样(所以它仍然需要 12 个块并且仍然在括号中):

[Sat Mar  9 21:36:20 2013]  [main]          [197777152]  [OK]  ******
[Sat Mar  9 21:36:20 2013]  [update_table]  [172680960]  [OK]  **********
[Sat Mar  9 21:36:22 2013]  [update_table]  [172680960]  [OK]  ******
[Sat Mar  9 21:36:25 2013]  [main]          [197777152]  [OK]  ****************

我正在考虑在 fprintf() 函数之前为 name 变量添加括号,但是在 C 中是否有一种简单的方法可以在字符串的开头添加一个字符?

谢谢。

【问题讨论】:

  • 顺便说一下,这些函数的char *参数应该是const char *

标签: c unix printf


【解决方案1】:

这对我来说似乎很容易。

#include <stdio.h>

int main()
{
    char buffer[16];

    sprintf(buffer,"[%s]", "main");
    printf("[0] %-14s [2]\n", buffer);

    sprintf(buffer,"[%s]", "update_table");
    printf("[0] %-14s [2]\n", buffer);

    sprintf(buffer,"[%s]", "main");
    printf("[0] %-14s [2]\n", buffer);

    return 0;
}

输出

[0] [main]         [2]
[0] [update_table] [2]
[0] [main]         [2]

【讨论】:

  • 请不要sprintf()!我不想再问有关缓冲区溢出错误的问题...
  • 回答与否由您决定。 printf 字段宽度说明符指示字符串不超过 12 个字符,诚然,它是惰性编码 - 我应该先使用 strlen,然后使用 malloc,然后使用 strcat(x3),最后使用 free,但它确实按预期工作。但是,出于对任何珍贵事物的热爱,请不要发布提供错误答案的解决方案。你试过运行你的代码吗?这是非常清楚和明显不正确的。您是否错过了全部目的是左对齐方括号内打印的值的部分?你的,H2S04 + HNO3...
【解决方案2】:

可以先在name变量的开头和结尾加上括号,然后打印name 正如你所做的%12s,但 left-justify 而不是 right-justify(这是默认值)

您可以使用 strcat 在开头和结尾添加括号。看: How do I concatenate const/literal strings in C?

此链接显示如何左对齐:(请参阅标志表) http://www.cplusplus.com/reference/cstdio/printf/

【讨论】:

  • 这里有一个代码 sn-p 来做到这一点:char N[15]; strcat(N, "["); strcat(N,名称); strcat(N,"]"); fprintf("%-12s", N);
【解决方案3】:

我没有看到任何简单的方法,但是您可以从中制作另一个字符串:

void update_log(char *name, pthread_t ID, char *status, char *update)
{
    time(&rawtime);
    time_str = asctime(localtime(&rawtime));
    time_str[strlen(time_str) - 1] = 0;

    size_t len = strlen(name);
    char real_name[len + 3];
    real_name[0] = '[';
    strncpy(real_name + 1, name, sizeof(real_name));
    real_name[len + 1] = ']';
    real_name[len + 2] = 0;

    fprintf(log_file, "[%s]  [%12s]  [%u]  [%s]  %s\n", time_str, real_name, (unsigned int)ID, status, update);
}

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 2013-12-15
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多