sprintf()C#中有类似的东西吗?
我想比如将整数转换为2字节的字节数组.
就像是:
int number = 17;
byte[] s = sprintf("%2c", number);
Run Code Online (Sandbox Code Playgroud) 所以在这里我相信我在查看其他人的代码时发现了一个小的缓冲区溢出问题.它立刻让我觉得不正确,而且有潜在危险,但不可否认,我无法解释这个"错误"的实际后果,如果有的话.
我写了一个测试应用程序来演示错误,但发现(令我沮丧的是)无论溢出如何,它似乎都能正常运行.我想相信这只是偶然的,但是需要一些反馈来确定我的想法是否错误,或者是否真的存在问题,而不是在我的测试应用程序中显示出来.
问题代码(我认为无论如何):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
Run Code Online (Sandbox Code Playgroud)
现在,这对我来说很突出,我想把它标记为可能的缓冲区溢出是因为第一个strlen.由于指针运算,"错误"放置+ 1将导致strlen返回26而不是27(取"他的字符串的长度为27个字符长").sprintf我相信,然后将27个字符打印到缓冲区并导致缓冲区溢出.
这是正确的评估吗?
我编写了一个测试应用程序来为我正在查看的代码演示这个,并发现即使在调试器中字符串也会正确打印.我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否可以影响邻近的内存区域,但仍然收到正确的输出.我意识到我新分配的堆内存可能不相邻,这可以解释缺乏有用的溢出,但我真的想确认其他人的意见,如果这实际上是一个问题.
由于这是一个非常简单的"问题",如果你能通过某种参考来支持你的答案,那就太好了.虽然我重视并欢迎您的意见,但我不会接受"是的"作为最终答案.提前谢谢你.
更新:许多有很多额外见解的好答案.不幸的是,我无法接受所有这些.感谢您分享您的知识并成为我的"第二意见".我很感激帮助.
在我的Haskell程序中,我想使用printf来格式化元组列表.我可以将printf映射到列表上,一次打印一个值,如下所示:
mapM_ (printf "Value: %d\n") [1,2,3,4]
Value: 1
Value: 2
Value: 3
Value: 4
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
mapM_ (printf "Values: %d %d\n") [(1,100),(2,350),(3,600),(4,200)]
Values: 1 100
Values: 2 350
Values: 3 600
Values: 4 200
Run Code Online (Sandbox Code Playgroud)
但是这会将一个元组传递给printf,而不是两个单独的值.如何将元组转换为printf的两个参数?
%s如果不需要额外的格式,在格式化数字时是否有任何理由不使用格式说明符?
例如
int answer = 42;
String text = String.format("The answer is %s", answer);
Run Code Online (Sandbox Code Playgroud)
而不是更常见的:
int answer = 42;
String text = String.format("The answer is %d", answer);
Run Code Online (Sandbox Code Playgroud)
我问的原因是我想要做一些自动更改源代码,这将是不方便,要弄清楚是否该类型answer是int或String或别的东西,
我有字符串的向量,并希望创建一个固定的字符串.较短的字符串应填充白色空格.例如:
c("fjdlksa01dada","rau","sjklf")
sprintf("%8s")
# returns
[1] "fjdlksa01dada" " rau" " sjklf"
Run Code Online (Sandbox Code Playgroud)
但是如何在字符串的END处获得额外的空格?
请注意,我从gdata包中听说过write.fwf 非常好但在这种情况下没有多大帮助,因为我需要为过时的旧程序编写一个非常具体的非标准格式.
我尝试将0到255之间的数字转换为十六进制格式.如果我使用sprintf("%X", 1)我得到1,但我需要输出总是宽度为2(前导0)而不是1.如何才能做到这一点?
在接受采访时我被问到了
使用该
printf()功能打印引号
我不堪重负.即使在他们的办公室里也有一台电脑,他们告诉我试一试.我试过这样的:
void main()
{
printf("Printing quotation mark " ");
}
Run Code Online (Sandbox Code Playgroud)
但我怀疑它不编译.当编译器得到第一个"它认为它是字符串的结尾时,它不是.那我该怎么做呢?
是否有类似sprintf()Linux内核的功能(如printf()- > printk())?
像sprintf一样的接缝有外包字符的问题吗?还是我做错了什么?看起来它在从字符串中移除像åäö这样的字符时起作用了.这有必要吗?
我希望为报告正确对齐以下行:
2011-11-27 A1823 -Ref. Leif - 12 873,00 18.98
2011-11-30 A1856 -Rättat xx - 6 594,00 19.18
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的sprintf():% - 12s% - 8s - % - 10s - %20s%8.2f
使用:php-5.3.23-nts-Win32-VC9-x86
我想知道这是否会产生未定义的行为:
printf("Test %d %s", 123, "abc", "def", "ghi");
Run Code Online (Sandbox Code Playgroud)
格式字符串后面的前两个参数匹配格式字符串,所以这些都可以; 但第3和第4个参数过多,因为没有更多相应的格式说明符.
恕我直言printf()应该忽略这些多余的论点,而且应该没有UB.它是否正确?