Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中,如何打印N个空格?(使用stringWithCharacters)_Objective C_Ios_Nsstring_Core Foundation - Fatal编程技术网

在Objective-C中,如何打印N个空格?(使用stringWithCharacters)

在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

尝试打印N个空格(或示例中的12个):


但他们都会打印出一些奇怪的东西,比如《你好,世界》。。。我认为“字符数组”与“字符串”和“字符指针”是一样的?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, "");