如何在不使用两次printf调用的情况下正确打印此内容?
char* second = "Second%d";
printf("First%d"second,1,2);
答案 0 :(得分: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
两次;它的价格并不比调用一次贵得多。)
答案 1 :(得分:0)
char *second = "Second%d";
char tmp[256];
memset(tmp, 0, 256);
sprintf(tmp, second, 2);
printf("First%d%s", 1,tmp);
或类似的东西
答案 2 :(得分:0)
使用预处理器连接两个字符串。
#define second "Second%d"
printf("First%d"second,1,2);
不要在真正的程序中执行此操作。
答案 3 :(得分:0)
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()将完全搞乱你的堆栈并进入杂草和结果崩溃数据将毫无用处。
答案 4 :(得分:-1)
我假设你想要输出:
First 1 Second 2
为此,我们需要更好地理解printf
的功能。 printf
如此有用的真正原因是它不仅打印字符串,还为您格式化变量。根据您希望变量格式化的方式,您需要使用不同的格式字符。 %d
告诉printf
将变量格式化为有符号整数,您已经知道了。但是,还有其他格式,例如%f
表示浮点数和双精度数,%l%
表示长整数,%s
表示字符串,或char*
。
使用%s
格式字符打印char*
变量second
,我们的代码如下所示:
char* second = "Second";
printf ( " First %d %s %d ", 1, second, 2 );
这告诉printf
您希望第一个变量格式化为整数,第二个变量格式化为字符串,第三个变量格式化为另一个整数。