【问题标题】:NSString* to char* casting issuesNSString* 到 char* 转换问题
【发布时间】:2011-05-03 14:52:31
【问题描述】:

我正在使用这种方法

-(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);

由于应用崩溃而无法正常工作!

我能做什么?

谢谢!

【问题讨论】:

  • 这是一个警告,而不是错误。你也可以直接投到(char *)[@"foo" UTF8String];
  • 由于UTF8String 返回const char * 并且您的方法采用const char * 参数,我不明白为什么您首先会收到警告。除非您的方法采用 char * 参数...

标签: iphone casting nsstring char


【解决方案1】:

既然您使用的是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"]];

【讨论】:

    【解决方案2】:

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

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

    如果需要修改指针,再分配一个,使用strcpy。

    【讨论】:

      【解决方案3】:

      当您执行 strcpy 时,您的应用会崩溃,因为您没有分配 a。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多