Objective c sprintf for NSString的功能

Objective c sprintf for NSString的功能,objective-c,cocoa,nsstring,printf,Objective C,Cocoa,Nsstring,Printf,如何获得Objective-C中的功能?函数当然是C中的代码< STDIO < /C> >的一部分,所以我当然可以调用它,但是既然我在使用基础,我需要它与 NScordS一起工作。 编辑 我为我的口齿不清表示歉意,但我实际上希望得到更像返回字符串的东西。(在Josh Caswell非常有效地编辑我的问题之前,这一点可能稍显明显。)这类似于NSLog,但不是写入控制台,而是将字符串(或指针)作为返回值。在Cocoa中执行相同操作的最接近的函数是NSString的stringWithFormat 使

如何获得Objective-C中的功能?函数当然是C中的代码< STDIO < /C> >的一部分,所以我当然可以调用它,但是既然我在使用基础,我需要它与<代码> NScordS一起工作。

编辑
我为我的口齿不清表示歉意,但我实际上希望得到更像返回字符串的东西。(在Josh Caswell非常有效地编辑我的问题之前,这一点可能稍显明显。)这类似于
NSLog
,但不是写入控制台,而是将字符串(或指针)作为返回值。

在Cocoa中执行相同操作的最接近的函数是
NSString
stringWithFormat

使用
sprintf

char buf[100];
sprintf(buf, "Line %d of %d", currentLine, totalLines);
使用
stringWithFormat:

NSString res = [NSString stringWithFormat:@"Line %d of %d", currentLine, totalLines];
请注意,
stringWithFormat:
支持使用
%@
格式说明符打印Cocoa对象。

一个选项:

NSString *OCSprintf(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

NSString *OCSprintf(NSString *format, ...)
{
   va_list args;
   va_start(args, format);
   NSString *result = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];
   va_end(args);
   return result;
}

这只是将
stringWithFormat:
(更准确地说,是它的一个近亲)包装为您所请求的函数。
NS\u FORMAT\u函数(1,2)
确保您仍然可以进行格式字符串检查。

建议:下次在C中使用
sprintf()
时,不要使用它,而是使用
snprintf()
(有99%的可能性可以避免严重的缓冲区溢出错误)。如果您认为我的编辑混淆了您的问题,我很抱歉。您可以随意重新编辑。不过,让我建议,简洁的标题通常是这里最好的。至于您正在寻找的信息,为什么要创建一个新函数?任何这样的方法都必须通过方法调用创建一个
NSString
,所以直接使用内置方法即可。如果您已经有了一个(可变)字符串,那么还有
appendFormat:
Hi Josh,简洁当然是一个优点,尤其是标题。你的编辑很好,但冲走了我一些不完整的观点。“为什么要创建函数?”你问道。我问你:为什么一遍又一遍地输入同样的冗长代码?也许你的时间比你知道的要多,但我们大多数人都不知道。我仍在试图勾勒出Objective C背后的总体设计,但到目前为止我很清楚,开发人员的便利性并不是主要动机。为什么要反复输入冗长的代码?这一点非常重要:可读性。一般规则:责任应该在作者身上,而不是读者身上。如果你永远是唯一一个阅读你的代码的人,那当然不相关了。在这种情况下,您可以将所有内容包装成1-2个字母的函数名,以节省编写时间。就像我说的:“开发人员方便”。这就是写作和阅读。如果括号语法便于人们阅读,我们都会使用RPN在黑板上进行数学运算。例如,我看不出CRD提供的函数包装器在可读性方面有什么问题。谢谢,dasblinkenlight。有没有办法获得
stringWithFormat:
的函数包装器?简洁不是Objective C的主要优点,我非常欣赏旧的语法。它类似于
NSLog
,但返回的是一个字符串/NSString。@JohnK您可以为
stringWithFormat:
编写一个小包装器,但不幸的是它没有内置任何东西。@JohnK:它作为宏比函数IMO更简单。
定义格式(args…[NSString stringWithFormat:args]
谢谢!这真是太酷了!或者是。但出于某种原因,它对我不起作用。XCode终止应用程序,并抱怨
GCC不允许函数定义的此位置使用format属性
关于
NS\u format\u函数(1,2)
,还抱怨
Class-method'+stringWithFormat:arguments:'未找到(返回类型默认为'id')
。事实上,我在Dev库中没有看到这种方法。我遗漏了什么吗?在中,我找到了
NSString*result…
line:
NSString*result=[[NSString alloc]initWithFormat:format arguments:args]autorelease]的替代品。这样,注释掉
NS\u FORMAT\u函数(1,2)
会使XCode停止抱怨。它可以工作,但遗憾的是没有格式字符串检查。@JohnK:NSString文档中也列出了所有三个
…with format:…
方法
NS\u FORMAT\u FUNCTION
和其他
\u attribute\uuuuu
不能用于函数定义,只能用于声明。@PeterHosey-感谢修复,我采用了这种方式,只是在复制时将其缩写了-这是一种糟糕的做法@PeterHosey/JohnK-你们都是对的,没有+stringWithFormat:arguments-结果我在一个类别中添加了它作为+alloc/-initWithFormat:arguments的缩写。我为我草率地粘贴了这个答案而道歉:-(
NSString * myString = [NSString stringWithFormat:@"...", params…];
const char * myStrPtr = [myString UTF8String];