如何在不使用两个 printf 调用的情况下正确打印?
char* second = "Second%d";
printf("First%d"second,1,2);
您向我们展示的代码在语法上无效,但我认为您想做的事情与以下效果相同:
printf("First%dSecond%d", 1, 2);
如您所知,第一个参数printf
是格式字符串。它不必是文字;你可以以任何你喜欢的方式构建它。
这是一个例子:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *second = "Second%d";
char format[100];
strcpy(format, "First%d");
strcat(format, second);
printf(format, 1, 2);
putchar('\n');
return 0;
}
一些注意事项:
我在输出后添加了一个换行符。输出文本应该(几乎)总是以换行符结束。
我为格式字符串设置了 100 字节的任意大小。更一般地说,您可以声明
char *format;
并通过调用来初始化它malloc()
,分配你实际需要的大小(并通过返回一个空指针来检查它是否表示malloc()
失败);然后你想free(format);
在你完成后打电话。
正如 templatetypedef 在评论中所说,如果格式字符串来自不受控制的来源,这种事情可能会很危险。
(或者您可以只调用printf
两次;它并不比调用一次贵多少。)
char *second = "Second%d";
char tmp[256];
memset(tmp, 0, 256);
sprintf(tmp, second, 2);
printf("First%d%s", 1,tmp);
或类似的东西
使用预处理器连接两个字符串。
#define second "Second%d"
printf("First%d"second,1,2);
不要在实际程序中这样做。
char *second = "Second %d";
char *first = "First %d";
char largebuffer[256];
strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1, 2);
使用生成格式(如上述方法)的问题在于 printf() 函数,因为它是一个可变长度参数列表,无法知道提供的参数数量。它所做的是使用提供的格式字符串并使用格式字符串中描述的类型,然后它将从参数列表中选择该数量和类型的参数。
如果您提供正确数量的参数,例如上面的示例,其中有两种 %d 格式,并且提供了两个整数以在这些位置打印,那么一切都很好。但是,如果您执行以下操作怎么办:
char *second = "Second %s";
char *first = "First %d";
char largebuffer[256];
strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1);
在此示例中, printf() 函数需要格式字符串以及可变数量的参数。格式字符串表示将有两个附加参数,一个整数和一个以零结尾的字符串。然而,只提供了一个附加参数,因此 printf() 函数将只使用堆栈中的下一个作为指向零终止字符串的指针。
如果幸运的话,printf() 函数解释为指针的数据将是您的应用程序的有效内存地址,指向的内存区域将是一对以零结尾的字符。如果您不太幸运,则指针将为零或垃圾,您将立即遇到访问冲突,并且很容易找到应用程序崩溃的原因。如果你一点运气都没有,指针会足够好,它会指向一个大约 2K 字符的有效地址,结果是 printf() 将完全弄乱你的堆栈并进入杂草并导致崩溃数据将毫无用处。
我假设你想要输出:
First 1 Second 2
为此,我们需要printf
更好地理解 's 的功能。如此有用的真正原因printf
是它不仅可以打印字符串,还可以为您格式化变量。根据您希望变量格式化的方式,您需要使用不同的格式化字符。%d
告诉printf
将变量格式化为您已经知道的有符号整数。但是,还有其他格式,例如%f
浮点数和双精度数、%l%
长整数、%s
字符串或char*
.
使用%s
格式化字符打印char*
变量second
,我们的代码如下所示:
char* second = "Second";
printf ( " First %d %s %d ", 1, second, 2 );
这告诉printf
您希望将第一个变量格式化为整数,将第二个变量格式化为字符串,将第三个变量格式化为另一个整数。