如何在Objective-C中的结构中将NSString的值存储为字符数组?

如何在Objective-C中的结构中将NSString的值存储为字符数组?,c,objective-c,struct,nsstring,char,C,Objective C,Struct,Nsstring,Char,在单例类的结构中,我很难将NSString的值分配给char*。下面是我问题的简化。我的代码在结构中使用了更多的字段,并传递了更多的NSStrings 假设我有一个具有结构的单例类“单例类”(我已经用Apple文档完成了我的家庭作业,并正确地实现了它): 使用此方法将struct1.string1的值设置为传递的NSString: - (void)initStructWithString:(NSString *)inputString { //warning: assignment d

在单例类的结构中,我很难将
NSString
的值分配给
char*
。下面是我问题的简化。我的代码在结构中使用了更多的字段,并传递了更多的
NSString
s

假设我有一个具有结构的单例类“单例类”(我已经用Apple文档完成了我的家庭作业,并正确地实现了它):

使用此方法将
struct1.string1
的值设置为传递的NSString:

- (void)initStructWithString:(NSString *)inputString {
     //warning: assignment discards qualifiers from pointer target type
     struct1.string1 = [inputString cStringUsingEncoding:NSUTF8StringEncoding];
}
这个方法使用了
struct1.string1

- (void)useCharArray {
     //I would obviously be doing something more complex in reality
     printf("This is the char array: %s", struct1.string1);
     //doesn't print the value I assigned to it, but garbage
}
当我从一个类调用
initStructWithString:(NSString*)inputString
并尝试从另一个类调用
useCharArray
struct1.string1
是一堆垃圾。在调试过程中,我已经确认每个类都得到了这个
SingletonClass
的相同实例

我仍然在学习Objective-C和C,所以我意识到这可能是我的内存管理问题。我知道我
[NSString cstringusingencode]
应该分配给
常量字符*
,而不是
字符*
,但我不知道如何处理它,因为结构中的字段是
字符*
。我在
initSructWithString
中尝试了其他方法,例如为
[NSString cstringusingencode]
的结果分配一个新的
const char*
,然后使用
strlcpy
将其复制到
struct1.string1
。这种方法也有同样的结果


NSString
的值存储在结构中的
char*
中的正确技术是什么?当不同的类使用
SingletonClass
时,如何确保此结构中的字段保留其值?

值得注意的是,正确的方法名称是
cstringusingencode:
;而且这个字符串大约在
inputString
消失的同时消失,因此结果字符串必须被复制


也许还值得探索一下如何使用
UTF8String
(一种方便的方法,也可以这样做)。

还不能评论,所以在这里写下(在给出上述答案之后)。。。我刚刚认识到这一点(我意识到这是几年后的事),并认为一个例子可能在某种程度上帮助其他人:

我用这个从iOS上的游戏中心获取玩家的名字,我会遇到一些关于时髦角色等的问题,但是我的字体不支持它们。ppName显然是一个指向char的指针,它被传递给我使用此代码的方法

*ppName = (char *)malloc(strlen([pPlayer.alias UTF8String]));
strcpy(*ppName, [pPlayer.alias UTF8String]);

如果您需要将NSString存储在结构中,然后从该结构获取NSString(例如,如果您需要在Game Center多人游戏中将字符串发送给另一名玩家),您可以这样做:

typedef struct {
   char stringToSend[20];
   int stringToSendLength;
} myStruct;

// create a Struct and an NSString
myStruct aStruct;
NSString *stringToConvert = @"stringToConvert";

// convert NSString into char array
for (int i = 0; i < stringToConvert.length; i++) {
    aStruct.stringToSend[i] = [stringToConvert characterAtIndex:i];
}

aStruct.stringToSendLength = stringToConvert.length; // send string length

// store struct into NSData object
NSData *data = [NSData dataWithBytes:&aStruct length:sizeof(myStruct)];

// retrieve data
myStruct *anotherStruct = (myStruct *)[data bytes];

// convert char array into NSString and only keep part required (without some weird random characters)
NSString *receivedString = [[NSString alloc] initWithBytes:anotherStruct->stringToSend length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding];
typedef结构{
char-stringToSend[20];
int stringToSendLength;
}我的结构;
//创建一个结构和一个NSString
我的结构;
NSString*stringToConvert=@“stringToConvert”;
//将NSString转换为字符数组
对于(int i=0;istringToSend length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding];

感谢您的更正和解释。所以,当你说copy时,我是不是在考虑使用memcpy,因为strlcpy之类的东西会将指针复制到一个将消失的字符串;但在复制之前还需要分配目标缓冲区;因此,实际上您有一些malloced内存可以将字符串复制到其中。
typedef struct {
   char stringToSend[20];
   int stringToSendLength;
} myStruct;

// create a Struct and an NSString
myStruct aStruct;
NSString *stringToConvert = @"stringToConvert";

// convert NSString into char array
for (int i = 0; i < stringToConvert.length; i++) {
    aStruct.stringToSend[i] = [stringToConvert characterAtIndex:i];
}

aStruct.stringToSendLength = stringToConvert.length; // send string length

// store struct into NSData object
NSData *data = [NSData dataWithBytes:&aStruct length:sizeof(myStruct)];

// retrieve data
myStruct *anotherStruct = (myStruct *)[data bytes];

// convert char array into NSString and only keep part required (without some weird random characters)
NSString *receivedString = [[NSString alloc] initWithBytes:anotherStruct->stringToSend length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding];