我怎么能在c中打印

时间:2012-06-21 21:07:10

标签: c printf

如何在不使用两次printf调用的情况下正确打印此内容?

char* second = "Second%d";
printf("First%d"second,1,2);

5 个答案:

答案 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您希望第一个变量格式化为整数,第二个变量格式化为字符串,第三个变量格式化为另一个整数。