是否可以自定义printf? 我有一些结构,我需要经常打印.现在,我在这个结构体周围使用了一个古典的打印包装这个功能很方便,但也很有限.我不能打印或附加一些文本,而不必制作新的包装.我知道我可以使用va_arg系列来添加或者添加一些文本,但是我觉得我会重新实现.我想知道是否可以为printf写一个自定义函数.我想要写这样的东西:这可能吗?
c – 当printf是变量的地址时,为什么要使用void *? 我在printf()中看到一些使用.如果我想打印一个变量的地址,可以这样做:>我想,&a是一个只是一个整数的地址,对吧?阅读的许多文章都是这样使用的:>%p代表什么?
c – 在程序出口处的printf flush 我有兴趣知道当程序退出时printf()函数的flush如何工作.我们来看下面的代码:在这种情况下,printf()如何管理将其缓冲区刷新到stdout?我想这是平台依赖,所以让我们来看Linux.它可以使用gcc的__attribute__来实现,但是标准库将依赖于编译器.我认为这不是它的工作方式.任何解释或链接到文档是赞赏.谢谢.解决方法当调用exit()时,C运行时将注册atexit()处理程序来刷新标准缓冲区.看这个explanation.
为什么case:总是需要常量表达式,而if()不是? 可能重复,但找不到相同的.假设我有以下C代码:我得到一个案例来检查a是零还是非零.一切都很好使用if-else,我也知道if-else的其他变体来实现这一点.但是问题来自于switch-case,因为它说我们可以在switch-case中实现我们可以在if-else中执行的所有操作.但以下代码失败.另外我知道在上面的代码中反转这个例子,如下所示将工作,我将有我的答案.但问题是,为什么?为什么在案件a:不是有效的情况下?switch-case是一个编译时操作和if()运行时?
c – 为什么写写比我讲的更多? 写入设置为25755,我告诉fwrite写一个文件,这是开头,然后im在一个位置除了25755以外的许多字节?解决方法如果您使用的是DOSish系统,并且文件未以二进制模式打开,则会自动转换行尾,并且每个“行”将添加一个字节.所以,指定“wb”作为模式,而不是只是“w”,因为@caf指出.它将对Unix平台没有影响,并且会对其他人做正确的事情.例如:用VC:用Cygwingcc:
#和##在宏 只要通过查看程序,“可能”就会期望输出为printf语句的输出一样.但是在运行该程序时,可以得到:为什么会这样?解决方法因为这是预处理器的工作原理.单个’#’将从给定的参数创建一个字符串,而不管该参数包含什么,而双“##”将通过连接参数创建一个新的标记.如果您想更好地了解宏如何评估宏,请尝试查看预处理的输出.
c – sprintf没有在范围内声明? 我有一个小代码片段,我设计的东西,但我不断得到错误sprintf没有在范围内声明?我在我的妈妈在VS上工作,但回到家,我不能得到它的代码块解决方法您需要包含stdio.h.stdio.h声明函数sprintf,没有标题,编译器没有办法了解什么sprintf的意思,因此它给你的错误.在C注意,包括cstdio在std命名空间和全局命名空间中导入符号名称.包括stdio.h在全局命名空间中输入符号名称,可能在std命名空间中.这同样适用于所有c风格的标题.
有人可以解释这个行为?只有2行代码 4个请仔细解释一下这段代码:输出:你好世界!返回13解决方法它是编译器特定的.你得到这个行为与GCC.这里有一些细节.因为你#include,这个放置是C99的标准,重新定义是undefinedbehavior>GCC编译器有一些优化将一些printf转换成一系列更快的put.这是合法的,因为您已经包括如果您使用-freestanding编译,则不会观察到.你的问题非常接近thisone;所以thisanswer也是有关系的.