0

如何在不使用两个 printf 调用的情况下正确打印?

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

5 回答 5

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两次;它并不比调用一次贵多少。)

于 2012-06-21T21:18:29.010 回答
0
char *second = "Second%d";
char tmp[256];
memset(tmp, 0, 256);
sprintf(tmp, second, 2);
printf("First%d%s", 1,tmp);

或类似的东西

于 2012-06-21T21:12:40.400 回答
0

使用预处理器连接两个字符串。

#define second "Second%d"
printf("First%d"second,1,2);

不要在实际程序中这样做。

于 2012-06-21T21:21:18.773 回答
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() 将完全弄乱你的堆栈并进入杂草并导致崩溃数据将毫无用处。

于 2012-06-21T21:36:43.490 回答
-1

我假设你想要输出:

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

于 2012-06-21T21:27:55.177 回答