设置printf中提到的文本宽度

时间:2014-05-28 20:46:34

标签: c width printf

我在一些遗留调试文件中有一些代码,其中包含如下的printf语句:

printf ("Abc1 = %d\n", var1);
printf ("Mnop2 = %d\n", var2);

这个文件有100个像这样的printf语句。文本(例如Abc1)的长度在所有这些语句之间变化,并且输出看起来非常难看。

我的问题是我可以以某种方式提及内部提到的文本字段的长度("")? 我知道我们可以添加%s并将文本移到外面。我不想这样做,因为这是遗留代码,还有100个或更多我需要更改的printfs。

感谢您的建议。

4 个答案:

答案 0 :(得分:2)

左对齐:

int NumSpacesNeeded=32-strlen("Abc1 = ");
char buf[32];
memset(buf, 0, 32);
memset(buf, ' ', numSpacesNeeded);
printf("Abc1 = %s %d\n", buf, var1);

但这可能需要做很多工作。

答案 1 :(得分:1)

嗯,如果你可以:

  1. 使用%10d通过变量添加填充,其中10是要填充的空格量。

  2. 在您的'文字后添加空格'使用\t,但如果您的文字长度不同,您必须调整使用的数量。

答案 2 :(得分:1)

如果我正确理解你的问题,你想要隐藏在幕后整洁的输出而不“干扰”现有代码。

首先,使用自定义名称替换printf。然后你可以在它周围写一个包装器。如果您的编译器理解可变参数宏,那么这可能只是一个宏。否则,您可以使用可变参数和printf推送自己的vprintf - 类函数。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#if VAR_ARG_MACRO_AVAILABLE

    #define tprintf(fmt, ...) do {          \
        printf("%.*s", 24 - strlen(fmt),    \
            "                        ");    \
        printf(fmt, __VA_ARGS__);           \
    } while (0)

#else

#include <stdarg.h>

int tprintf(const char *fmt, ...)
{
    va_list va;
    int n;

    va_start(va, fmt);

    n = 24 - strlen(fmt);
    if (n < 0) n = 0;
    printf("%.*s", n, "                        ");

    n += vprintf(fmt, va);

    va_end(va);

    return n;
}

#endif

int main()
{
    tprintf("a = %d\n", 2);
    tprintf("alpha = %d\n", 21);
    tprintf("alphabetical = %d\n", 112);

    return 0;
}

宏解决方案依赖于少于约20个字符的变量名称。否则,将采用字段宽度的绝对值,这可能会损坏您的布局。

使用strlen(而不是,例如,strchr(fmt, '='))是一种近似值,如果您具有不同长度的格式说明符,则无法使用,例如%zu%llu等等。

答案 3 :(得分:1)

使用重定向编辑重新输出输出。

Windows示例遵循以下内容:

#include <stdio.h>

#define OUTFILE "temp.txt"

#define START stream = freopen(OUTFILE, "w", stdout)
#define END reOUT()


FILE *stream;

void reOUT(void){
    stream = freopen("CON", "w", stdout);
    FILE *fin = fopen(OUTFILE, "r");
    char line[128], field1[16], field2[16];
    while(fgets(line, sizeof(line), fin)){
        if(sscanf(line, "%15s = %15s", field1, field2)==2)
            printf("%10s = %10s\n", field1, field2);
        else
            printf("%s", line);
    }
    fclose(fin);
    remove(OUTFILE);
}

int main(){
    int var1 = 11, var2=22;
    START;
    printf ("Abc1 = %d\n", var1);
    printf ("normal print\n");
    printf ("Mnop2 = %d\n", var2);
    END;
    return 0;
}