C 如何在printf中填充两个字符串?

C 如何在printf中填充两个字符串?,c,C,例如: printf("%-10s%s\n", s1, s2); 我可以得到: s1 s2 当前面的字符串可能具有不同的长度时,我希望s3位于固定列 printf("%s%s%s\n", s1, s2, s3); // how to padding 10? s1s2 s3 s11s22 s3 s111s222 s3 您必须使用一点逻辑来计算要打印的空格数,例如: int s3_column = 15; // example posi

例如:

printf("%-10s%s\n", s1, s2);
我可以得到:

s1         s2
当前面的字符串可能具有不同的长度时,我希望s3位于固定列

printf("%s%s%s\n", s1, s2, s3); // how to padding 10?

s1s2         s3
s11s22       s3
s111s222     s3

您必须使用一点逻辑来计算要打印的空格数,例如:

int s3_column = 15;   // example position
int length = printf("[%s%s]", s1, s2);
if ( length >= 0 && length < s3_column )
    printf("%*s", (int)(s3_column - length), "");
printf("%s\n", s3);
ints3\u列=15;//示例位置
int length=printf(“[%s%s]”,s1,s2);
if(长度>=0&&length

正如评论中所建议的,另一种可能的方法是在自己的缓冲区中准备
[s1s2]
部分,但这需要额外的内存,并且会产生与内存分配相关的所有潜在问题,与我的示例中计算空格相比,这将是一个更复杂的代码。

您必须使用一点逻辑来计算要打印多少空格,例如:

int s3_column = 15;   // example position
int length = printf("[%s%s]", s1, s2);
if ( length >= 0 && length < s3_column )
    printf("%*s", (int)(s3_column - length), "");
printf("%s\n", s3);
ints3\u列=15;//示例位置
int length=printf(“[%s%s]”,s1,s2);
if(长度>=0&&length

正如评论中所建议的,另一种可能的方法是在自己的缓冲区中准备
[s1s2]
部分,但这需要额外的内存,并且会产生与内存分配相关的所有潜在问题,与我的示例中计算空格相比,这将是更复杂的代码。

每个
%s
都包含一个n.m修饰符(%n.ms),用于将每个字符串放置在已知的起点(并避免溢出到下一个字符串所需的位置)然后确保'm'的总和将第三个字符串正好放在您希望它开始的位置

--或--

在第二个“输出格式转换”说明符之后使用ANSI转义序列将光标放置在第三个字符串开始的位置

--或--

运行ncurses窗口并使用
movexy()
将光标放置在希望第三个字符串开始的位置

--或--

如果使用Borland的
conio.h
库,则使用:

gotoxy()`
--或--

在窗户里

#include <windows.h>

void SetPosition(int X, int Y)
{
    HANDLE Screen;
    Screen = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD Position={X, Y};

    SetConsoleCursorPosition(Screen, Position);
}
#包括
无效设置位置(整数X,整数Y)
{
手柄屏;
屏幕=GetStdHandle(标准输出句柄);
坐标位置={X,Y};
设置控制台位置(屏幕、位置);
}

每个
%s
都包含一个n.m修饰符(%n.ms),将每个字符串放置在一个已知的起始点(并避免溢出到下一个字符串所需的位置),然后确保'm'的总和将第三个字符串正好放置在您希望它开始的位置

--或--

在第二个“输出格式转换”说明符之后使用ANSI转义序列将光标放置在第三个字符串开始的位置

--或--

运行ncurses窗口并使用
movexy()
将光标放置在希望第三个字符串开始的位置

--或--

如果使用Borland的
conio.h
库,则使用:

gotoxy()`
--或--

在窗户里

#include <windows.h>

void SetPosition(int X, int Y)
{
    HANDLE Screen;
    Screen = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD Position={X, Y};

    SetConsoleCursorPosition(Screen, Position);
}
#包括
无效设置位置(整数X,整数Y)
{
手柄屏;
屏幕=GetStdHandle(标准输出句柄);
坐标位置={X,Y};
设置控制台位置(屏幕、位置);
}

缩进的值是多少?您希望字符串之间有多少填充?我认为当前面的字符串可能具有不同的长度时,他们希望在固定列上有
s3
。缩进的值是多少?当早期的字符串可能具有不同的长度。有任何特定原因,您无法将
s1
s2
连接起来,并将它们一起传递给
printf
printf(“[%-10s]%s\n”,s1,s2)
打印
[s1]s2
(但是有8个空格,决定删除)@kopecs为什么要浪费时间和空间来连接字符串,而你可以直接打印它们呢?有什么具体原因不能将
s1
s2
连接在一起并传递给
printf
printf([%-10s]%s\n”,s1,s2)
打印
[s1]s2
(但是有8个空格,因此决定删除)@kopec为什么要浪费时间和空间来连接字符串,而您可以直接打印它们呢?出于好奇,第4行中的
(int)
转换有什么意义?@rici
*
的参数必须具有
int
类型。在这段代码中,它是不必要的,但一般来说,人们可能会使用
size\u t
表达式来进行这种计算,所以我习惯于总是将它包括在内,出于好奇,第4行中的
(int)
转换有什么意义?@rici
*
的参数必须具有类型
int
。在这段代码中,这是不必要的,但一般来说,人们可能会使用
size\u t
表达式来进行这种计算,所以我习惯于总是包含它