我在一些遗留调试文件中有一些代码,其中包含如下的printf语句:
printf ("Abc1 = %d\n", var1);
printf ("Mnop2 = %d\n", var2);
这个文件有100个像这样的printf语句。文本(例如Abc1)的长度在所有这些语句之间变化,并且输出看起来非常难看。
我的问题是我可以以某种方式提及内部提到的文本字段的长度("")? 我知道我们可以添加%s并将文本移到外面。我不想这样做,因为这是遗留代码,还有100个或更多我需要更改的printfs。
感谢您的建议。
答案 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)
嗯,如果你可以:
使用%10d
通过变量添加填充,其中10是要填充的空格量。
在您的'文字后添加空格'使用\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;
}