所以我想要做的就是每当我触摸一个按钮时,它会调用一个带有char和一些可变数量参数的函数(在这种情况下,两个int值都是24)。
- (IBAction)buttonPressed:(id)sender {
number = 24;
printf_to_debug("some text %d %d ",number, number);
//printf(" %d %d ",number, number);
}
但是,当我调用该函数时,似乎总是将我的注意改为一些大数字,我不明白。
void printf_to_debug (char* fmt, ...) {
va_list args;
va_start( args, fmt );
printf(fmt, args);
charString = [NSString stringWithUTF8String: fmt];
charString = [NSString stringWithFormat:charString, args];
debugTextString = [NSString stringWithFormat:@"%@\r%@",charString, debugTextString];
va_end( args );
}
是否有人发现我的代码存在问题?
答案 0 :(得分:2)
您必须使用vprintf()
打印va_list
:
va_list args;
va_start (args, fmt );
vprintf(fmt, args);
va_end( args );
相应的NSString
方法为initWithFormat:arguments:
:
NSString *s = [[NSString alloc] initWithFormat:@(fmt) arguments:args];
答案 1 :(得分:0)
让我们来看看你的代码实际上做了什么。
第一个重要的一行是:printf_to_debug("some text %d %d ",number, number);
哪个看起来很好,但无论如何它都被视为int
并不重要。
接下来,你初始化变量参数列表,这很好但是你尝试打印使用:
printf(fmt, args);
现在,当您使用该代码时,您似乎希望printf将变量参数列表中的每个单独对象视为一个单独的参数,但是,printf并不关心。它只看到你传递了一个参数。它并不知道或不关心参数是什么,它所知道和关心的是你告诉它将它作为十进制数给出的第一个参数(' s'% d"说)。现在,它需要va_list并将其视为一个数字并打印出来。由于你只提供了一个参数,你获得的第二个数字是完全垃圾,我怀疑XCode试图警告你(命令行clang确实如此)。
现在为简单的解决方案:
当您尝试将变量参数列表打印为单独的对象时,请使用vprintf函数。因此,在您的情况下,它将是vprintf(fmt, args);