尝试打印出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
......我认为“char数组”与“字符串”相同,而且与“指向字符的指针”相同? API规范说它是一个“Unicode字符的C数组”(通过Unicode,它是UTF8吗?如果是,那么它应该与ASCII兼容)...如何使它工作以及为什么这三种方式赢了不行吗?
答案 0 :(得分:17)
您可以使用%*s
指定宽度。
NSLog(@"Hello%*sWorld", 12, "");
字段宽度或精度或两者都可以用星号表示 ('*')。在这种情况下,int类型的参数提供字段宽度 或精确。应用程序应确保参数指定 字段宽度或精度,或两者都在之前以该顺序出现 要转换的参数(如果有的话)。
答案 1 :(得分:16)
这样可以得到你想要的东西:
NSLog(@"hello%@world", [@"" stringByPaddingToLength:12 withString:@" " startingAtIndex:0]);
答案 2 :(得分:6)
我认为你遇到的问题是你误解了+(NSString *)stringWithCharacters:length:
应该做什么。它不应该重复字符,而是将它们从数组复制到字符串中。
所以在你的情况下,你在数组中只有一个'',这意味着其他11个字符将取自内存中arrayChars
之后的任何内容。
如果你想打印出n个空格的模式,最简单的方法就是使用-(NSString *)stringByPaddingToLength:withString:startingAtIndex:
,即创建这样的东西。
NSString *formatString = @"Hello%@World";
NSString *paddingString = [[NSString string] stringByPaddingToLength: n withString: @" " startingAtIndex: 0];
NSLog(formatString, paddingString);
答案 3 :(得分:4)
这可能是最快的方法:
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
一个char数组,但是不是unichar
数组。)
我上面提供的方法可能是动态长度最快的方法。如果您愿意使用GCC扩展,并且您需要固定大小的空间数组,则可以执行以下操作:
NSString *spacesWithLength7()
{
unichar characters[] = { [0 ... 7] = ' ' };
return [NSString stringWithCharacters:characters length:7];
}
不幸的是,该扩展名不适用于变量,所以它必须是常量。
通过GCC扩展和预处理器宏的魔力,我给你......重复者!只需传入一个字符串(或一个字符),它将完成其余的工作!现在购买,只需19.95美元,运营商随时待命! (基于@JeremyL建议的想法)
// 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];
}
答案 4 :(得分:3)
stringWithCharaters:length:
方法使用C数组中的第一个长度字符生成NSString
(或NSString
的子类的实例)。它不会迭代给定的字符数组,直到它达到长度。
您看到的输出是内存区域12个Unicode字符长,从您传递的1个Unicode字符数组的位置开始。
这应该有用。
NSLog(@"hello%@world", [NSString stringWithCharacters:" " length:12]);