翻译C++';将sprintf格式字符串转换为C#和#x27;s string.Format 我发现下面的C++代码(注释添加了自己):

翻译C++';将sprintf格式字符串转换为C#和#x27;s string.Format 我发现下面的C++代码(注释添加了自己):,c#,c++,printf,string.format,C#,C++,Printf,String.format,然后我试着把它翻译成C# //前缀是字符串 //k是for循环计数器 //框架是列表 string frameName=string.Format(“{0}}(这里是什么?.bmp“),前缀k,frames[k]); 基本上,C++格式字符串的“C等价”是“%s% 0×s bMP”?< /p> 编辑,@markbyers: 我已经尝试了您的代码并制作了一个小测试程序: static void Main(string[] args) { List<string> frames

然后我试着把它翻译成C#

//前缀是字符串
//k是for循环计数器
//框架是列表
string frameName=string.Format(“{0}}(这里是什么?.bmp“),前缀k,frames[k]);
<>基本上,C++格式字符串的“C等价”是“%s% 0×s bMP”?< /p> 编辑,@markbyers:

我已经尝试了您的代码并制作了一个小测试程序:

static void Main(string[] args)
{
    List<string> frames = new List<string>();
    frames.Add("blah");
    frames.Add("cool");
    frames.Add("fsdt");

    string prefix = "prefix";
    int n = 2;
    int k = 0;
    string frameName = string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(n, '0'));
    Console.WriteLine(frameName); // outputs prefix_blah.bmp, should output prefix_00blah.bmp
    Console.ReadLine();
 }
static void Main(字符串[]args)
{
列表帧=新列表();
框架。添加(“废话”);
框架。添加(“酷”);
框架。添加(“fsdt”);
字符串前缀=“前缀”;
int n=2;
int k=0;
string frameName=string.Format(“{0}{1}.bmp”,前缀,frames[k].PadLeft(n,'0');
Console.WriteLine(frameName);//输出前缀_blah.bmp,应输出前缀_00blah.bmp
Console.ReadLine();
}
因为某种原因,它不是填充物


编辑:让它工作;如果n=2,则不会填充。

对于
%0*s
中的
0*
等格式细节,我会这样做:

string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));
如果我有它的权利,它将采取
帧[k]
,并左垫0的

e、 g:


这就是你想要的吗?

要用零填充字符串,请使用:

结合:


请注意,我已将
k
更改为
n
,因为我假设这是原始代码中的一个bug。我认为文件名上的填充长度不太可能在循环的每次迭代中增加一个。

您确定要将
k
用于两个不同的目的吗?您确定要使用这些格式字符串吗?具体来说:
%0*s
-根据这里的手册页,与
s
转换一起使用的
0
修饰符是未定义的行为。这是我在查看开源程序时得到的。你不应该假设你得到的是正确的。检查文档。
%0*s
中的*请求使用参数指定精度。因此,1代表
%s
,1代表
*
,1代表
%0*s
,或3。除了
0
s
外,其他的都是UB-请看我对这个问题的评论。谢谢,去测试代码;我会让你知道结果的。谢谢,但显然这不是填充;请参阅原始帖子。@thebackup:它不是填充,因为您设置了n=2。n是最小长度。如果你总是想加两个零,那就容易多了,而且不需要PadLeft函数;它如预期的那样工作——这正是我首先想要的。非常感谢,马克。
static void Main(string[] args)
{
    List<string> frames = new List<string>();
    frames.Add("blah");
    frames.Add("cool");
    frames.Add("fsdt");

    string prefix = "prefix";
    int n = 2;
    int k = 0;
    string frameName = string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(n, '0'));
    Console.WriteLine(frameName); // outputs prefix_blah.bmp, should output prefix_00blah.bmp
    Console.ReadLine();
 }
string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));
k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";
frames[k].PadLeft(n, '0')
int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
                                 prefix,
                                 frames[k].PadLeft(n, '0'));