2011-05-03 64 views
0

我与这个方法的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 

所以我鑫卡特投切为const char *到一个char * ... ...和唯一途径我知道是使用strcpy。

这样:

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

... 

char *a; 
strcpy(a, AAA1); 

不工作,因为该应用程序崩溃!

我该怎么办?

谢谢!

+0

这是一个警告,而不是错误。你也可以转换为'(char *)[@“foo”UTF8String];' – Eimantas 2011-05-03 14:58:04

+0

既然'UTF8String'返回一个'const char *'并且你的方法需要'const char *'params,我不明白为什么你首先得到警告。除非你的方法需要'char *'params ... – albertamg 2011-05-03 15:08:58

回答

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"]]; 
+0

太棒了!谢谢 ;) – JAA 2011-05-03 15:32:49

1

你说得对,你不能将NSString强制转换为原始类型,因为NSString是一个对象。

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

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

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的)。