#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 *).