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

以下是试图打印出N个空格(在本例中为12个):

NSLog(@"hello%@world", [NSString stringWithCharacters:" " length:12]); const unichar arrayChars[] = {' '}; NSLog(@"hello%@world", [NSString stringWithCharacters:arrayChars length:12]); const unichar oneChar = ' '; NSLog(@"hello%@world", [NSString stringWithCharacters:&oneChar length:12]); 

但是他们都打印出怪异的东西,比如hello ÔÅÓñüÔÅ®Óñü®ÓüÅ®ÓñüÔ®ÓüÔÅ®world ,我认为“字符数组”和“string”是一样的,和“指向字符的指针”是一样的, ? API规范说,它是一个“Unicode字符的C数组”(通过Unicode,是UTF8吗?如果是,那么它应该与ASCII兼容)…如何使它工作,为什么这3种方式赢得不工作?

您可以使用%*s来指定宽度。

 NSLog(@"Hello%*sWorld", 12, ""); 

参考:

字段宽度或精度或两者都可以用星号('*')表示。 在这种情况下,types为int的参数提供了字段宽度或精度。 应用程序应确保指定字段宽度或精度的参数,或两者都以参数之前的顺序出现(如果有),以进行转换。

这会得到你想要的:

 NSLog(@"hello%@world", [@"" stringByPaddingToLength:12 withString:@" " startingAtIndex:0]); 

我认为你的问题是你误解了什么+(NSString *)stringWithCharacters:length:应该做的。 它不应该重复字符,而是将它们从数组中复制到一个string中。

所以在你的情况下,你只能在数组中有一个“',这意味着其他11个字符将取自arrayChars在内存中的任何内容。

如果你想打印出一个n空格的模式,最简单的方法是使用-(NSString *)stringByPaddingToLength:withString:startingAtIndex:即创build类似这样的东西。

 NSString *formatString = @"Hello%@World"; NSString *paddingString = [[NSString string] stringByPaddingToLength: n withString: @" " startingAtIndex: 0]; NSLog(formatString, paddingString); 

这可能是最快的方法:

 NSString *spacesWithLength(int nSpaces) { char UTF8Arr[nSpaces + 1]; memset(UTF8Arr, ' ', nSpaces * sizeof(*UTF8Arr)); UTF8Arr[nSpaces] = '\0'; return [NSString stringWithUTF8String:UTF8Arr]; } 

你当前的代码不工作的原因是因为+stringWithCharacters:期望一个数组长度为12的字符,而你的数组只有1个字符的长度{' '} 。 所以,为了解决这个问题,你必须为你的数组创build一个缓冲区(在这种情况下,我们使用一个char数组,而不是unichar ,因为我们可以轻松地memset一个char数组,而不是一个unichar数组)。

上面提供的方法可能是dynamic长度最快的方法。 如果你愿意使用GCC扩展,并且你需要一个固定大小的空格数组,你可以这样做:

 NSString *spacesWithLength7() { unichar characters[] = { [0 ... 7] = ' ' }; return [NSString stringWithCharacters:characters length:7]; } 

不幸的是,该扩展不能用于variables,所以它必须是一个常量。

通过GCC扩展和预处理器macros的魔力,我给你…重复器! 只需传入一个string(或一个字符),它就会完成剩下的工作! 现在买,花费你只有19.95美元,运营商正在屹立! (基于@JeremyLbuild议的想法)

 // step 1: determine if char is a char or string, or NSString. // step 2: repeat that char or string // step 3: return that as a NSString #define repeat(inp, cnt) __rep_func__(@encode(typeof(inp)), inp, cnt) // arg list: (int siz, int / char *input, int n) static inline NSString *__rep_func__(char *typ, ...) { const char *str = NULL; int n; { va_list args; va_start(args, typ); if (typ[0] == 'i') str = (const char []) { va_arg(args, int), '\0' }; else if (typ[0] == '@') str = [va_arg(args, id) UTF8String]; else str = va_arg(args, const char *); n = va_arg(args, int); va_end(args); } int len = strlen(str); char outbuf[(len * n) + 1]; // now copy the content for (int i = 0; i < n; i++) { for (int j = 0; j < len; j++) { outbuf[(i * len) + j] = str[j]; } } outbuf[(len * n)] = '\0'; return [NSString stringWithUTF8String:outbuf]; } 

stringWithCharaters:length:方法使用C数组中的第一个长度字符生成NSString (或NSString的子类的实例)。 它不会迭代给定的字符数组,直到达到长度。

你看到的输出是从你传递的1个Unicode字符数组的位置开始的长12个Unicode字符的区域。

这应该工作。

 NSLog(@"hello%@world", [NSString stringWithCharacters:" " length:12]);