Проблемы с приведением NSString * к символу *

#iphone #casting #nsstring #char

#iPhone #Кастинг #nsstring #символ

Вопрос:

я работаю с этим методом

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

при написании этого кода код работает

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

[self fetchDataFromTLE:line1 AndLine2:line2];
  

это работает.

Но мне нужно взять line1 и line2 из NSUserDefaults, сохраненных как 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 * в постоянный символ 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);
  

не работает, потому что приложение вылетает!

Что я могу сделать?

Спасибо!

Комментарии:

1. Это предупреждение, а не ошибка. Вы также можете просто привести к (char *)[@"foo" UTF8String];

2. Поскольку UTF8String возвращает const char * , а ваш метод принимает const char * параметры, я не понимаю, почему вы вообще получаете предупреждение. Если только ваш метод не принимает 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 *).