【问题标题】:Translating C++'s sprintf format string to C#'s string.Format将 C++ 的 sprintf 格式字符串转换为 C# 的 string.Format
【发布时间】:2010-06-05 22:37:22
【问题描述】:

我找到了以下 C++ 代码(cmets 自己添加的):

// frame_name is a char array
// prefix is std::string
// k is a for loop counter
// frames is a std::vector string
sprintf(frameName, "%s_%0*s.bmp", prefix.c_str(), k, frames[k].c_str());

然后我尝试将其翻译成 C#

// prefix is string
// k is a for loop counter
// frames is List<string>
string frameName = string.Format("{0}_(what goes in here?).bmp", prefix, k, frames[k]);

基本上,C++ 格式字符串“%s_%0*s.bmp”的 C# 等效项是什么?

编辑,@Mark Byers:

我已经试过你的代码并做了一个小测试程序:

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();
 }

由于某种原因它不是填充。

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

【问题讨论】:

  • 您确定要将k 用于两个不同的目的吗?
  • 您确定这些格式字符串吗?具体来说:%0*s - 根据此处的手册页,0 修饰符与 s 转换一起是未定义的行为。
  • 这是我在查看开源程序时得到的。
  • 你不应该假设你得到的是正确的。检查文档。

标签: c# c++ printf string.format


【解决方案1】:

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

frames[k].PadLeft(n, '0')

结合string.Format:

int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
                                 prefix,
                                 frames[k].PadLeft(n, '0'));

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

【讨论】:

  • 谢谢,但显然不是填充;见原帖。
  • @thebackup:这不是填充,因为您设置了 n = 2。n 是最小长度。如果您只想始终添加两个零,那会容易得多,并且不需要 PadLeft 函数。
  • 哦,好的,我现在明白了;它按预期工作 - 这正是我最初想要的。非常感谢,马克。
【解决方案2】:

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

string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));

如果我做对了,它会占用frames[k],并用0填充它。

例如:

k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";

这就是你所追求的吗?

【讨论】:

  • %0*s 中的 * 请求使用参数来指定精度。因此,%s 为 1,* 为 1,%0*s 为 1,或者 3。
  • 除了0s 似乎是UB - 请参阅我对这个问题的评论。
  • 谢谢,去测试一下代码;我会让你知道结果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2021-11-17
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多