我在托管的C#代码中有一个string format和IEnumerable< object > parameters(盒装值的集合).
format- 类似printf的格式说明符(根据ANSI/ISO 9899-1990),
parameters- 需要处理的参数(参数)的集合format.
任务 - 如何从格式说明符和参数集合中获取最终格式化的字符串?(http://www.codeproject.com/KB/printing/PrintfImplementationinCS.aspx解决方案除外)
请不要回答"为什么你需要printf格式?使用String.Format"或类似的东西......不幸的是,我不能逃避我所拥有的...
好的,我听说你应该把一个指针指向一个普通的指针,即void *在打印它之前,必须练习使用%p占位符而不是%d在printf打印它们的函数中.
我只是觉得可以在打印时防止截断大地址,或者是其他什么?但关键是如果你在一台64位指针和32位整数的机器上; 使用%p而不是%d将完成这项工作.
有人知道这种铸造技术有用的任何实际情况吗?
The first block
#include <stdio.h>
const int MAX = 3;
int main() {
int var[] = { 10, 100, 200 };
int i, *ptr[MAX];
for (i = 0; i < MAX; i++) {
ptr[i] = &var[i]; /* assign the address of integer. */
}
for (i = 0; i < MAX; i++) {
printf("Value of var[%d] = %d\n", i, *ptr[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Easy to understand, since ptr is an array of int pointers. So when you need to …
我们可以使用内置printf函数打印当前时间,而无需调用date像这样的外部命令,如下所示:
printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1
# sample output: 2019-03-30:17:39:36,846
Run Code Online (Sandbox Code Playgroud)
我们如何让 printf 也打印毫秒或纳秒?在格式字符串中使用%3N或%N不起作用:
printf '%(%Y-%m-%d:%H:%M:%S,%3N)T %s\n' -1 # outputs 2019-03-30:17:38:16,%3N
printf '%(%Y-%m-%d:%H:%M:%S,%N)T %s\n' -1 # outputs 2019-03-30:17:38:16,%N
Run Code Online (Sandbox Code Playgroud)
但是, date 命令工作正常:
date +%Y-%m-%d:%H:%M:%S,%3N # gives 2019-03-30:17:39:36,846
date +%Y-%m-%d:%H:%M:%S,%N # gives 2019-03-30:17:39:36,160643077
Run Code Online (Sandbox Code Playgroud)
这是在 Red Hat Linux 7.3 版上。
我可以在%d格式说明符中输入的最大宽度值是多少?例如:
int c=0;
printf("%1234567899d%n",0,&c);
printf("%d",c);
Run Code Online (Sandbox Code Playgroud)
当我使用大值的写入值c是0。这是为什么?
所以这是我的最小样本:
int main( int argc, char* argv[] )
{
printf("First stuff\n");
}
Run Code Online (Sandbox Code Playgroud)
我的程序挂在 printf 上。我已经通过调试器深入研究了反汇编。执行进入 printf,进入call qword ptr [__imp___stdio_common_vfprintf (07FF67A6D73F0h)]
从这里开始,跳转/调用是未命名的。该代码挂call在一个显式地址上。这是有人以前见过的东西吗?我正在使用 MSVC 工具 v142、VS 2019、SDK 10.0.18362.0
我的程序运行良好,突然开始挂在 printfs 上。我以为我引入了某种内存损坏,直到我将 printf 移到程序的第一行并看到相同的结果。删除我的输出文件夹并重新编译没有效果。虽然看起来一些代码更改确实可以让我摆脱这种奇怪的模式,但它会再次随机发生。
此外,关闭 Visual Studio 并重新打开,然后重建似乎可以解决该问题。
我正在编译使用 Microsoft Dmf 框架 (DmfK.lib) 的内核模式驱动程序
在上次 Visual Studio 更新之后,出现了一些奇怪的链接器错误:
EmulationTargetPDO.obj : error LNK2019: unresolved external symbol __stdio_common_vswprintf referenced in function _vsnwprintf_l
Utilities.lib(savedata.obj) : error LNK2001: unresolved external symbol __stdio_common_vswprintf
DmfK.lib(DmfUtility.obj) : error LNK2001: unresolved external symbol __stdio_common_vswprintf
EmulationTargetPDO.obj : error LNK2019: unresolved external symbol __stdio_common_vsprintf referenced in function _vsnprintf_l
DmfK.lib(DmfCore.obj) : error LNK2001: unresolved external symbol __stdio_common_vsprintf
DmfK.lib(Dmf_CrashDump.obj) : error LNK2019: unresolved external symbol __stdio_common_vsprintf_s referenced in function _vsprintf_s_l
Run Code Online (Sandbox Code Playgroud)
这是我使用的软件和套件版本(显示在 VS“关于”窗口中):
int main(int argc, char **argv){
printf("argv: %s\n",argv); // does not work and prints random stuff
printf("*argv: %s\n",*argv); // works and prints ".a.out"
}
Run Code Online (Sandbox Code Playgroud)
我测试:
./a.out nop
Run Code Online (Sandbox Code Playgroud)
我的困惑是这样的:
第二行中的“argv”变量具有“./a.out”的第一个字符的地址。
第三行中的“*argv”变量是“./a.out”的第一个字符。
那么为什么printf("argv: %s\n",argv);只打印“./a.out”不起作用呢?
我知道这是错误的,但我不知道为什么。
在下面的代码中,似乎 XXXXXX 要求生成随机字符来替换它。这里的XXXXXX是什么意思呢?这是 中的一些特殊保留符号吗sprintf?
sprintf(tempName, "/tmp/%s-XXXXXX", filename.c_str());
Run Code Online (Sandbox Code Playgroud) 我正在使用 Ubuntu 22.04 进行一些软件开发,并处理二进制数据。我最近发现了2.35 版本的公告glibc;它指出版本 2.35 合并了二进制转换格式说明符 %b和%B:
\n\n\n
\n- printf 系列函数现在支持以二进制形式输出\n整数的 %b 格式(如 ISO C2X 草案中所指定),以及 ISO C2X 草案推荐的该格式的 %B 变体。
\n
我已glibc按如下方式检查了我的版本,但我不确定这是获取此信息的权威方式:
$ ldd --version\nldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35\nRun Code Online (Sandbox Code Playgroud)\n%b和%B,但是......大约一个月前,我在这个 Ubuntu 上为一个微控制器项目安装了Raspberry Pi C SDK 。我使用了二进制格式说明符%b,%B如下printf所示:
printf("\\n binary values stored in rcvdata[0]: %#b \\n", rcvdata[0]);\n printf(" …Run Code Online (Sandbox Code Playgroud)