我陷入了printf问题.如果我能在这里得到一些帮助,我将不胜感激:在下面的代码中,我可以看到字体系列在第一个printf()中被正确替换,但是如果我将它设置为变量,我只得到一个空字符串.如何将其放入变量并具有正确的值?我只是不想输入'font.family().family().string().utf8().data()'到处都是?
我用同样的方法做了这个:
void myMethod() {
const char* fontFamily = font.family().family().string().utf8().data();
// get displayed correctly
printf ("drawText1 %s \n", font.family().family().string().utf8().data());
// get an empty string
printf ("drawText2 %s \n", fontFamily);
}
Run Code Online (Sandbox Code Playgroud)
而'data()'的签名是
class CString {
public:
CString() { }
CString(const char*);
CString(const char*, unsigned length);
CString(CStringBuffer* buffer) : m_buffer(buffer) { }
static CString newUninitialized(size_t length, char*& characterBuffer);
const char* data() const;
//...
}
Run Code Online (Sandbox Code Playgroud)
utf8()的签名是
class String {
CString utf8() const;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我对类似printf的格式字符串的理解是你可以为任何转换说明符添加最小字段宽度的前缀.这对Cocoa的%@说明符似乎不起作用.例:
NSLog(@"'%5@'", @"foo");
NSLog(@"'%5s'", [@"foo" UTF8String]);
Run Code Online (Sandbox Code Playgroud)
输出:
… 'foo'
… ' foo'
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
当我在emacs中从Swank repl运行Clojure代码时,主线程将使用printf将消息打印到repl.但是如果我运行代理或显式创建其他也打印的线程,有时输出不会显示,有时它会显示在我运行Swank的控制台窗口中.我很想知道为什么.
编辑:感谢丹尼尔的回答下面我现在知道了其他线程不必了绑定到REPL的输出.此代码有效,因为您从运行的位置传出.但是我的新问题是这个代码现在阻塞每个线程,所以不是并行运行,而是每次运行一个线程,所以我需要一个更多线程感知的输出方法.
(defn sleeper-thread [out id t]
"Sleep for time T ms"
(binding [*out* out]
(printf "%d sleeping for time %d\n" id t)
(Thread/sleep t)
(printf "%d slept\n" id)))
(defn test-threads [n out]
(dotimes [x n]
(.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-int 5000)))))))
Run Code Online (Sandbox Code Playgroud) 我正在为一台带有'printf'操作码的机器编写一个模拟器,虽然我知道Formatter类可能足以实际格式化字符串,但我需要一种方法来计算参数的数量.由printf调用消耗.
在我的头脑中,我可能会用正则表达式来计算'%'的数量,但我对格式字符串不太熟悉,所以我可能算不上......(不包括转义的,等等)
编辑:我实际上需要参数的数量,以及参数#到参数类型的映射,例如,"hello%s%+.3i"会给{0 - > String,1 - > Integer}
我正在创建一个修改过的printf实现,我不确定这些问题的答案.
零是否作为空字符串工作?(被printf("%s", 0)允许吗?)
我猜不是,因为0是一个int.但是这会引发这个问题:
是否NULL作为空字符串?(被printf("%s", NULL)允许吗?)
从逻辑上讲,我认为它应该是肯定的,因为它NULL意味着指针; 但是很多实现似乎都有#define NULL 0,所以我觉得在实践中可能没有.哪个是对的?
指针类型是否必须指向char?(被printf("%s", (void const *)"")允许吗?)
我的猜测是类型并不重要,但我不确定.
我正在阅读以前编写的代码,并找到了StringCbPrintf()函数
我在msdn网站上发现了这样的声明:
HRESULT StringCbPrintf(
_Out_ LPTSTR pszDest,
_In_ size_t cbDest,
_In_ LPCTSTR pszFormat,
_In_ ...
);
Run Code Online (Sandbox Code Playgroud)
什么是_in_和_out_这里?
为什么我们已经拥有它需要它sprintf()?
我正在尝试在字符串中找到命名捕获组的开头以创建一个简单的解析器(请参阅相关问题).为此,该extract函数会记住last4变量中最后一个字符.如果最后4个字符等于"(?P <",则它是捕获组的开头:
package main
import "fmt"
const sample string = `/(?P<country>m((a|b).+)(x|y)n)/(?P<city>.+)`
func main() {
extract(sample)
}
func extract(regex string) {
last4 := new([4]int32)
for _, c := range regex {
last4[0], last4[1], last4[2], last4[3] = last4[1], last4[2], last4[3], c
last4String := fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])
if last4String == "(?P<" {
fmt.Print("start of capturing group")
}
}
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/pqA-wCuvux
但这段代码什么都没打印!last4String == "(?P<"永远不会是真的,虽然如果我last4String在循环中打印,这个子句会出现在输出中.如何比较Go中的字符串呢?
是否有更优雅的方式将int32数组转换为字符串fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])?
还有什么比这更好的了吗?我的代码对我来说看起来有点不合适.
我已经实现fputc并fgetc在retarget.c中通过UART0在Cortex-M3上成功使用printf.
但是,我想要第二个uart通道来获取其他调试信息.我如何使用printf将UART0整合得很好?
例如,使用fprintf到自定义目标并检查fputc将字符发送到哪个目标.例如,用于正常输出fprintf(UART0,"..");和用于调试输出fprintf(UART1,"..");
但我无法看到fopen是否被调用stdout所以我很难看到如何手动实现它.(如果我只是打电话fprintf(RANDOM_VALUE,..),我不知道这会怎么样.
我想,一旦我将它定向到一个不同的'FILE',那么它只是检查在fputc中指向哪个,但它是我正在努力的FILE指针的初始设置.
也许某种方式来区分stdout和stderr,尽管那时我仍然有同样的问题从两个独立的通道获取输入.
microlib中也是fprintf?如果没有,有没有更好的方法来实现这个?
谢谢!
我正在比较两个程序的输出,一个C是另一个C++,使用diff,所以输出必须相同.
是否有任何方法可以printf将它格式化,就好像它是使用打印一样<< mydouble.
我目前正在使用 printf("%g",mydouble)
以下是一些差异的例子:
c: 3.24769e-05 c++: 3.2477e-05
c: 0.0026572 c++: 0.00265721
Run Code Online (Sandbox Code Playgroud)
有趣的是,科学记数法在c中有更多的数字,十进制表示法在c ++中有更多.
我正在编写基于微控制器的应用程序,我需要将其转换为float字符串,但我不需要与sprintf()相关的繁重开销.有没有雄辩的方法来做到这一点?我不需要太多.我只需要2位数的精度.