NSString * to char * проблемы с кастингом - PullRequest
0 голосов
/ 03 мая 2011

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

-(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 * в 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 ]

3 голосов
/ 03 мая 2011

Поскольку вы используете target-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 голосов
/ 03 мая 2011

Ваше приложение аварийно завершает работу, когда вы выполняете команду 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);

Я бы предложил адаптировать вашФункция, если возможно, так как вы работаете в target-c, вы должны работать с объектами target-c (NSString *).

1 голос
/ 03 мая 2011

Вы правы, вы не можете привести NSString к примитивному типу, так как NSString является объектом.

Вы можете безопасно преобразовать результат UTF8String в char *, если вы уверены, что вызываемая функция не изменит значение, указанное указателем. В противном случае у вас возникнут проблемы с вашим объектом NSString.

Если вам нужно изменить указатель, выделите другой и используйте strcpy.

...