我正在尝试使用scanf为NSString分配一个值,根据Omar对 this question 的回答。这是代码,直接来自progrmr的答案:
char word[40];
int nChars = scanf("%39s", word); // read up to 39 chars (leave room for NUL)
NSString* word2 = [NSString stringWithBytes:word
length:nChars
encoding:NSUTF8StringEncoding];
然而,我在最后一行收到的错误对我来说完全没有意义:
No known class method for selector 'stringWithBytes:length:encoding:'
世界上有什么可能导致此错误?
是的,我的文件顶部有#import <Foundation/Foundation.h>
。
答案 0 :(得分:4)
NSString
没有stringWithBytes:length:encoding:
类方法,但您可以使用
NSString* word2 = [[NSString alloc] initWithBytes:word
length:nChars
encoding:NSUTF8StringEncoding];
但请注意,scanf()
会返回扫描的项目数和
不是已扫描的字符数。因此nChars
将包含1
而不是字符串长度,因此您应该设置nChars = strlen(word)
。
更简单的替代方案(在链接问题的一个答案中也提到)
NSString* word2 = [NSString stringWithUTF8String:word];
答案 1 :(得分:2)
NSString不响应选择器stringWithBytes:length:encoding:
。您可能想要initWithBytes:length:encoding:
。
答案 2 :(得分:0)
简而言之:您可能想为您的 NSString 对象考虑一个适合 const char C-string 的初始化程序。此外,在向 NSString 对象发送任何初始化消息之前分配内存。我希望是这样的:
char word[40];
int nChars = scanf("%39s", word);
NSString *word2 = [[NSString alloc] initWithCString:word encoding:NSASCIIStringEncoding];
请注意,每个设计的 initWithCString 仅支持正确以 null '\0' 结尾的 8 位字符数组。对于未终止的字节数组,您可以使用 initWithBytes:length:encoding: 代替。
对于 Unicode 字符,您可以考虑 initWithCharactersNoCopy:length:freeWhenDone:。