在Objective-C中,如何打印N个空格?(使用stringWithCharacters)
尝试打印N个空格(或示例中的12个):在Objective-C中,如何打印N个空格?(使用stringWithCharacters),objective-c,ios,nsstring,core-foundation,Objective C,Ios,Nsstring,Core Foundation,尝试打印N个空格(或示例中的12个): 但他们都会打印出一些奇怪的东西,比如《你好,世界》。。。我认为“字符数组”与“字符串”和“字符指针”是一样的?API规范说它是一个“Unicode字符的C数组”(按Unicode,是UTF8吗?如果是,那么它应该与ASCII兼容)。。。如何使其工作以及为什么这三种方法不起作用?这可能是最快的方法: NSString *spacesWithLength(int nSpaces) { char UTF8Arr[nSpaces + 1]; me
但他们都会打印出一些奇怪的东西,比如《你好,世界》。。。我认为“字符数组”与“字符串”和“字符指针”是一样的?API规范说它是一个“Unicode字符的C数组”(按Unicode,是UTF8吗?如果是,那么它应该与ASCII兼容)。。。如何使其工作以及为什么这三种方法不起作用?这可能是最快的方法:
NSString *spacesWithLength(int nSpaces)
{
char UTF8Arr[nSpaces + 1];
memset(UTF8Arr, ' ', nSpaces * sizeof(*UTF8Arr));
UTF8Arr[nSpaces] = '\0';
return [NSString stringWithUTF8String:UTF8Arr];
}
当前代码无法工作的原因是+stringWithCharacters:
需要一个长度为12个字符的数组,而数组的长度只有1个字符{'}
。因此,要解决这个问题,您必须为数组创建一个缓冲区(在本例中,我们使用char
数组,而不是unichar
,因为我们可以轻松地memset
字符数组,而不是unichar
数组)
我上面提供的方法可能是动态长度下可能的最快方法。如果您愿意使用GCC扩展,并且您有一个固定大小的所需空间数组,您可以这样做:
NSString *spacesWithLength7()
{
unichar characters[] = { [0 ... 7] = ' ' };
return [NSString stringWithCharacters:characters length:7];
}
不幸的是,该扩展不适用于变量,因此它必须是常量
通过GCC扩展和预处理器宏的魔力,我给你。。。。中继器!只需传入一个字符串(或一个字符),其余的就可以了!立即购买,只需花费19.95美元,运营商随时待命!(基于@JeremyL提出的想法)
//步骤1:确定char是char还是string,还是NSString。
//步骤2:重复该字符或字符串
//步骤3:将其作为NSString返回
#定义重复(inp,cnt)u_rep_func_u(@encode(typeof(inp)),inp,cnt)
//参数列表:(int-siz,int/char*input,int-n)
静态内联NSString*\uuuu rep\u func\uuuu(字符*类型,…)
{
const char*str=NULL;
int n;
{
va_列表参数;
va_启动(参数,典型);
如果(类型[0]=“i”)
str=(const char[]){va_arg(args,int),'\0'};
else if(类型[0]='@')
str=[va_arg(args,id)UTF8String];
其他的
str=va_arg(args,const char*);
n=va_arg(args,int);
va_端(args);
}
int len=strlen(str);
字符溢出[(len*n)+1];
//现在复制内容
对于(int i=0;i
这将满足您的需求:
NSLog(@"hello%@world", [@"" stringByPaddingToLength:12 withString:@" " startingAtIndex:0]);
我认为你的问题是你误解了
+(NSString*)stringWithCharacters:length:
应该做什么。它不应该重复这些字符,而是将它们从数组复制到字符串中
因此,在您的示例中,数组中只有一个“”字符,这意味着其他11个字符将从内存中的arrayChars
后面的任何字符中提取
如果要打印n个空格的图案,最简单的方法是使用-(NSString*)stringByPaddingToLength:with-string:startingAtIndex:
,即创建如下内容
NSString *formatString = @"Hello%@World";
NSString *paddingString = [[NSString string] stringByPaddingToLength: n withString: @" " startingAtIndex: 0];
NSLog(formatString, paddingString);
stringwithcharacters:length:
方法使用C数组中的第一个长度字符生成一个NSString
(或NSString
的子类的实例)。它不会在给定的字符数组上迭代,直到达到指定的长度
您看到的输出是从传递的1 Unicode字符数组位置开始的12个Unicode字符的内存区域
这应该行得通
NSLog(@"hello%@world", [NSString stringWithCharacters:" " length:12]);
您可以使用
%*s
指定宽度
NSLog(@"Hello%*sWorld", 12, "");
字段宽度或精度或两者都可用星号表示
( '*' ). 在本例中,int类型的参数提供字段宽度
或者精确。申请书应确保:
字段宽度或精度,或两者都按顺序显示在
要转换的参数(如果有)
我的好先生,这不是很清楚你在做什么,也没有代码格式-1.别担心。还给了你一个+1,因为我发现否决票有点不公平。请注意,
-stringByPaddingToLength:
天生就是慢的。它必须分配一个大于当前字符串大小的缓冲区,复制当前字符串的内容,然后插入和移动字符串中的所有字符。这就是为什么我的方法性能更好的原因,因为它依赖于非常快的C-API。当然,OP可能更喜欢可读性和简单性更抽象的方法,请记住问题在于理解API是如何工作的……在这种情况下,为什么不只使用NSString
literal?很难理解。最初的问题是为什么这个特定的方法调用没有给出预期的结果。我的示例只是展示如何调用特定的方法以获得预期的结果。我的回答是帮助澄清这种方法是如何工作的。这是一个非常有趣的问题,我认为原始海报需要理解这种方法。所以我对他的代码做了最小的编辑,以得到他期望的结果。我只希望这些方法是内置的。。。我认为TRS-80Basic有一些类似于string(“,12)
的东西,这会起作用,如果使用Ruby,”*12
。。。如果Objective-C可能有类似于@.的东西。重复(12)
或类似内置的东西,那就太好了。(虽然Objective-C已经很不错了)@JeremyL我同意。虽然可以使用宏高效地编写,但我不知道它到底有多有用。@JeremyL看看我刚才编写的宏。我允许您进行重复(“test”,5)
或重复('t',12)
,并将为C-string和char执行您想要的操作!(我能
NSLog(@"hello%@world", [NSString stringWithCharacters:" " length:12]);
NSLog(@"Hello%*sWorld", 12, "");