通过剖析,我发现这里的sprintf需要很长时间.是否有更好的替代方案仍然处理y/m/dh/m/s字段中的前导零?
SYSTEMTIME sysTime;
GetLocalTime( &sysTime );
char buf[80];
for (int i = 0; i < 100000; i++)
{
sprintf(buf, "%4d-%02d-%02d %02d:%02d:%02d",
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
}
Run Code Online (Sandbox Code Playgroud)
注意:OP在评论中解释说这是一个精简的例子."真实"循环包含使用来自数据库的不同时间值的附加代码.分析已经确定sprintf()为罪犯.
例如,如果我不应该使用像printf,putchar这样的标准库函数,那么如何轻松地将字符打印到屏幕上.有没有简单的方法来做到这一点.我不太了解系统调用,如果我必须使用它们,那么如何?
那么任何一个建议都可以轻松打印而不使用库函数?
我无法弄清楚的简单问题......
如何在printf字符串中打印'%'字符?下面的代码打印出来,但也会出现"无效转换"错误.
printf "\t\t".$hour."00 HRS\t=>\t%.2f\t%.2f\t%.1f\%\n", $total, $max15, ($max15/$total*100);
Run Code Online (Sandbox Code Playgroud)
应输出如下内容:
0000 HRS => 3125.19 898.02 28.7%
Run Code Online (Sandbox Code Playgroud) 为了创建一个格式化的文件,我想利用fprintf.它必须获取char*参数,但我有几个字符串变量.我该怎么用fprintf?
什么是格式化程序,以确保+或 - 符号始终显示在C的printf()中浮点值的前面?
我有一段时间没有做过C,所以在哪里可以找到网上的好参考,任何建议都表示赞赏
我正在写信,看看你们中是否有人见过或听说过我将要描述的想法的实现.
我有兴趣为嵌入式目标开发一个printf样式的调试库.目标是非常远程的,我和目标之间的通信带宽预算非常紧张,所以我希望能够以非常有效的格式获得调试消息.
通常,调试语句类似于以下内容:
myDebugLibraryPrintf("Inside loop, processing item %d out of %d.\n", i, numItems);
Run Code Online (Sandbox Code Playgroud)
当然,当它被扩展为文本时,打印的字符串类似于"内部循环,处理项目5中的10个\n",总共约42个字节左右.此语句打印出的90%以上的数据是静态的,字面的 - 在编译时已知.当然,在编译时只知道"5"和"10".
我想做的是只能回发那两个整数(8个字节而不是42个).一旦我收到了这些数据,我就会有一些"解码器响铃"让我"重新构建"收到的数据并在我的位置打印出完整的调试信息.
我会自动生成"解码器环"(作为构建过程的一部分),在编译时为每个myDebugLibraryPrintf()语句提供一个唯一的ID,并生成一个将这些唯一ID映射到原始格式字符串的表.然后,任何时候myDebugLibraryPrintf()被调用的目标时,它发送该唯一ID和任何的"%d","%f"等可变参数格式字符串看到的值,但格式字符串本身不会被传送.(我"%s"现在可能只是禁止使用项目...)回到我的位置,我们将有一个程序查找表中的唯一ID,找到相应的格式字符串,并使用它来重建原始调试消息.
我觉得以前可能有人有这个想法,我想社区中的某个人可能会看到类似的东西(或者甚至知道这样做的开源库).
约束:
为了澄清,我在这里处理C/C++,我对printf()的100%完全替换实现不感兴趣 - 像非文字格式字符串,%s(字符串)格式说明符或更高级的东西格式说明符,例如将宽度或精度放在varargs列表中,%*.*d不需要支持.
我希望字符串表作为构建过程的一部分自动生成,因此添加调试不会比添加传统的printf()更多的工作.如果需要超过最小努力量,我项目中的任何人都不会使用它.
在生成字符串表的构建过程中做额外的工作几乎是假定的.幸运的是,我控制了我对使用这个库感兴趣的所有源代码,并且我在构建过程中有很大的灵活性.
谢谢!
C++:printf()格式规范是float什么?(Visual C++)
它曾经是我用%g的float和%lg为double.
它看起来像规格改变了,并且float是未定义double的%g.
我打印出来的内存中的位数因此不能选择.
有没有办法可以打印出float值printf()?
更新:
此代码是为在嵌入式系统上使用的通用C++库的单元测试而编写的.这是我必须做的float工作才能开始工作.代码在模板函数中:
template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned>
Error testMatrixT()
{ ...
Run Code Online (Sandbox Code Playgroud)
这是一个代码片段:
if (typeid(Ttyp) == typeid(float)) {
float64 c = *(float32*)&Tp(row,col);
float64 a1 = *(float32*)&Arg1(row,col);
float64 a2 = *(float32*)&Arg2(row,col);
float64 e = *(float32*)&Exp(row,col);
m_b = (c == e);
_snprintf(m_acDiag, sizeof(m_acDiag)-1
, "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s" …Run Code Online (Sandbox Code Playgroud) 我有一个案例,我想使用文件中的输入作为printf()awk 格式.当我在代码中的字符串中设置它时,我的格式化工作,但是当我从输入加载它时它不起作用.
这是问题的一个小例子:
$ # putting the format in a variable works just fine:
$ echo "" | awk -vs="hello:\t%s\n\tfoo" '{printf(s "bar\n", "world");}'
hello: world
foobar
$ # But getting the format from an input file does not.
$ echo "hello:\t%s\n\tfoo" | awk '{s=$0; printf(s "bar\n", "world");}'
hello:\tworld\n\tfoobar
$
Run Code Online (Sandbox Code Playgroud)
所以...格式替换工作(" %s"),但不是像tab和换行符这样的特殊字符.知道为什么会这样吗?有没有办法"做某事"输入数据,使其可用作格式字符串?
更新#1:
作为进一步的示例,请考虑以下使用bash heretext:
[me@here ~]$ awk -vs="hello: %s\nworld: %s\n" '{printf(s, "foo", "bar");}' <<<""
hello: foo
world: bar
[me@here ~]$ awk '{s=$0; printf(s, "foo", "bar");}' <<<"hello: %s\nworld: …Run Code Online (Sandbox Code Playgroud) 我想打印变量值而不指定其类型.
在c中,我可以做到
int main(int argc, char **argv) {
int i = 1;
float f = 0.1;
char s[] = "s";
printf("%i\n", i);
printf("%f\n", f);
printf("%s", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我希望:
int main(int argc, char **argv) {
int i = 1;
float f = 0.1;
char s[] = "s";
printf("%any_type\n", i);
printf("%any_type\n", f);
printf("%any_type", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题:有没有%any_type用C?
我试图学习指针,我写了下面的代码来打印指针的值:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf("%c",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
一个
但是,如果我将上面的代码更改为:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出:
ABC
我不明白以下两件事:
为什么printf在第二种情况下不需要格式说明符?是否printf(pointer_name)足以打印指针的值?
根据我的理解(这很少),*p指向包含的连续内存块abc.我预计两个输出都是相同的,即
ABC
由于印刷方式不同,是不同的产出?
编辑1
此外,以下代码会产生运行时错误.为什么这样?
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)