NSString *到char *转换问题

时间:2011-05-03 14:52:32

标签: iphone casting nsstring char

我正在使用这种方法

-(void)fetchDataFromTLE:(const char *)line1 AndLine2:(const char *)line2{

写这个,代码工作

char *line1= "blablabla";
char *lin2= "blebleble";

[self fetchDataFromTLE:line1 AndLine2:line2];

它有效。

但是我需要从NSUserDefaults获取line1和line2,保存为NSString。

所以:

NSString *line1 = [[NSUserDefaults standardUserDefaults] objectforkey:@"line1"];
NSString *line2 = [[NSUserDefaults standardUserDefaults] objectforkey:@"line2"];

当然,如果我试着调用我的方法

[self fetchDataFromTLE:line1 AndLine2:line2];

它不起作用

passing argument 1 of 'fetchDataFromTLE:AndLine2:' from incompatible pointer type
passing argument 2 of 'fetchDataFromTLE:AndLine2:' from incompatible pointer type

这是正常的。 所以我想将我的NSString *转换为char *,但我发现只有一种方法可以将NSString *转换为const char *。

const char *AAA1 = [line1 UTF8String];

演员表是正确的,但是如果调用我的方法我有这个错误

warning: passing argument 1 of 'fetchDataFromTLE:AndLine2:' discards qualifiers from pointer target type

所以我想把che const char *转换为char * ...而且我知道的唯一方法是使用strcpy。

这样:

#include <stdio.h>
#include <string.h>

...

char *a;
strcpy(a, AAA1);

不起作用,因为应用程序崩溃了!

我该怎么办?

谢谢!

3 个答案:

答案 0 :(得分:3)

由于您使用的是objective-c,为什么不将NSString作为参数,然后在函数内部进行转换。这将使您的代码在需要调用方法时更容易使用。

-(void)fetchDataFromTLE:(NSString*)line1 AndLine2:(NSString*)line2
{
    const char *szLine1 = [line1 UTF8String];
    const char *szLine2 = [line2 UTF8String];

    ...
    //Use the the char * only within the method
}

您的代码将如下所示

[self fetchDataFromTLE:[[NSUserDefaults standardUserDefaults] objectforkey:@"line1"]
              AndLine2:[[NSUserDefaults standardUserDefaults] objectforkey:@"line2"]];

答案 1 :(得分:2)

当您执行strcpy时,您的应用程序崩溃了,因为您尚未分配。

char *a; //This doesn't actually point to anything
strcpy(a, AAA1);

你想要做的是:

char *a = (char*)malloc(strlen(AAA1)+1);
strcpy(a, AAA1);

//perform your operations using a...

free(a);

如果可能的话,我建议调整你的函数,因为你在objective-c中工作,你应该使用objective-c对象(NSString *)。

答案 2 :(得分:1)

你是对的,你不能将NSString转换为基本类型,因为NSString是一个对象。

只要您确定所调用的函数不会修改指针指向的值,您就可以安全地将UTF8String的结果转换为char *。否则,您将遇到NSString对象的问题。

如果需要修改指针,则分配另一个指针,然后使用strcpy。