我想写一个像printf这样的例程,而不是功能上的,但是我希望例程能够像printf一样编译检查特性.
例如,如果我有:
{
int i;
std::string s;
printf("%d %d",i);
printf("%d",s.c_str());
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨如下:
1 cc1plus: warnings being treated as errors
2 In function 'int main()':
3 Line 8: warning: too few arguments for format
4 Line 9: warning: format '%d' expects type 'int', but argument 2 has type 'const char*'
Run Code Online (Sandbox Code Playgroud)
printf和co是编译器对待的特殊函数,还是有一些技巧可以让它在任何用户定义的函数上工作?我感兴趣的具体编译器是gcc和msvc
我正在尝试在AIX上构建python-kerberos.kerberospw.c使用了对asprintf的调用,但是从谷歌告诉我的是,asprintf在AIX上不存在.
我看到http://www.koders.com/c/fidAA9B130D588302673A28B568430A83131B7734C0.aspx?s=windows.h,它看起来像我可以创建一个替身asprintf,但我不知道这个会去或我会怎样#include它在kerberospw.c中.
有没有办法可以使用koders.com示例或其他一些代码"伪造"asprintf?我可以只包含asprintf函数,如kerberospw.c所示?我不是C编码员,但是
asprintf(char**resultp,const char*format,...)
用最后的圆点看起来对我来说不是一个有效的签名.kerberospw.c的相关部分如下
asprintf(消息"%*S:%*S",(int)的result_code_string.length,
(字符*)result_code_string.data,
(INT)result_string.length,
(字符*)result_string.data);
我知道我可以联系上python-的Kerberos的作者,但)我认为这将是有帮助的潜在的补丁,如果我这样做,和b)有可能是其他的软件我碰到运行使用asprintf,这将是很高兴有一个解决方法.
我正在寻找一种方法来为或使用命名参数.sprintfprintf
例:
sprintf(
'Last time logged in was %hours hours,
%minutes minutes, %seconds seconds ago'
,$hours,$minutes, $seconds
);
Run Code Online (Sandbox Code Playgroud)
或通过vsprintf和一个关联数组.
我在这里找到了一些编码示例
function sprintfn ($format, array $args = array())
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/de/function.sprintf.php
和这里
function vnsprintf( $format, array $data)
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/de/function.vsprintf.php
人们写自己的解决方案.
但我的问题是,是否有可能有一个标准的PHP解决方案来实现这一点,还是有另一种方式,也许是由PEAR提供的简单的PHP模板,我可以通过坚持标准的PHP实现这一点?
谢谢你的帮助.
我正在为gcc编译器寻找gotoxy()的替代品并找到了 -
void gotoxy(int x,int y)
{
printf("%c[%d;%df",0x1B,y,x);
}
Run Code Online (Sandbox Code Playgroud)
我想知道它是如何运作的,我的意思是我们什么时候使用[和;在printf内部,0x1B在那里做什么以及如何将光标带到这个代码的行/列?
我从来没有在书中看到过这种类型的printf练习,所以它会很棒如果你能指出我可以找到关于printf的这种用途的链接.
可能重复:
了解printf的硬件
我不是在寻找printf功能的实现,但我想知道,当printf用C 调用时会发生什么?所有活动都在软件和硬件级别进行.
这就是我认为PrintfCAll - > KernelModeOn - > SystemCallMade - >数据放在一些排序的输出缓冲区 - >输出被转储到某些控制器的缓冲区 - >控制器将其转储到监视器 - >中断CPU说工作已完成.
我有多正确?谢谢.
编辑:Unix可以作为一个平台.说ubuntu.有人可以告诉我,数据从何处流出,是否还有监视器的控制器?上面提到的时间表在多大程度上是正确的?
是否可以使功能静音?例如:
#include <stdio.h>
int function(){
printf("BLAH!");
return 10;
}
int main(){
printf("%d", silence( function()) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而不是:
BLAH!
10
Run Code Online (Sandbox Code Playgroud)
我会得到:
10
Run Code Online (Sandbox Code Playgroud)
可能吗?如果积极怎么办呢?
我很想知道printf()当程序退出时函数的flush 如何工作.
我们来看下面的代码:
int main(int ac, char **av)
{
printf("Hi");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何printf()管理将其缓冲区刷新到stdout?
我想这是平台依赖的,所以让我们采取Linux.
它可以使用gcc's 实现,__attribute__((dtor))但标准库将依赖于编译器.我认为这不是它的工作方式.
任何解释或文档链接表示赞赏.谢谢.
我有一个C++ 11程序,用于std::fprintf写入stderr日志和调试信息.我知道fprintf可以失败并返回负值,但我无法找到操作是否为原子(如果失败,没有效果),或者它可以写入文本的某些部分然后失败(或任何其他副作用).
使用的函数fprintf如下所示:
void writeToConsole (std::string const &message)
{
std::fprintf(stderr, "%s\n", message.c_str());
}
Run Code Online (Sandbox Code Playgroud)
我正在Linux上开发使用Clang和GCC(现在),但我的问题更多是关于标准,所以......
如果std::fprintf失败,仍有可能写入某些字符stderr?此行为是C/C++标准还是实现定义的?
更重要的是,如果std::fprintf失败,我应该中止该程序还是可以在没有副作用的情况下静默执行(除了不可能写入stderr)?
这个C程序给出了一个奇怪的结果:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str1[5] = "abcde";
char str2[5] = " haha";
printf("%s\n", str1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到:
abcde haha
Run Code Online (Sandbox Code Playgroud)
我只想打印第一个字符串,从代码中可以看出.
为什么要打印它们?
请考虑以下简化代码.我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出.
我有额外的3个字节0xFFFFFF.怎么了?额外的字节来自哪里?
产量
in:
2000FFFFFFAF00690033005A00
out:
2000FFFFFFAF00690033005A00
Run Code Online (Sandbox Code Playgroud)
program.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int i;
char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00};
FILE *outfile;
char *buf;
printf("in:\n\t");
for( i=0; i<10; i++ )
printf("%02X", raw[i]);
outfile = fopen("raw_data.bin", "w+b");
fwrite(raw, 1, 10, outfile);
buf = (char *) malloc (32 * sizeof(char));
fseek(outfile, 0, SEEK_SET);
fread(buf, 1, 10, outfile);
printf("\nout:\n\t");
for( i=0; i<10; i++ )
printf("%02X", buf[i]);
printf("\n");
fclose(outfile);
return 0;
}
Run Code Online (Sandbox Code Playgroud)