为什么传递NSString指针不为我工作



我有麻烦通过函数调用传递/接收NSString指针。我希望有人能帮我看看我做错了什么。

这是我第一堂课的…

void addTo(int pk, NSString* nam, NSString *descrip)
{    
    //open the database
    sqlite3 *db;
    db = [Item openDB:databasePath];
    printf("'%i', '%s', '%s'", pk, nam, descrip);
    //create new item with key, name, description, and database
    Item *Obj = [[Item alloc]initWithPrimaryKey:pk:nam:descrip:db];
                          .
                          .
                          .
}

然后这是Item中的函数。

- (id) initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db{
    printf("'%i', '%s', '%s'", pk, nam, descrip);
                         .
                         .
                         .
    return self;
}

假设我调用addTo,输入1234,"Tree", "plant with leaves"

第一个代码块中的打印输出我发送给addTo的内容,但initWithPrimaryKey中的打印打印以下内容…

'1234', 'P?a', 'P?a' 

为什么会这样?或更多. .为什么打印出来的不是我想要的?

%s用于char*字符串,但%@应与nsstring一起使用。printf可能支持也可能不支持%@,我不知道。如果没有,你需要使用NSString的cStringUsingEncoding或UTF8String来转换为你可以使用的char*

initWithPrimaryKey:pk:nam:descrip:db是无效的(或者至少是非常循环的)语法,顺便说一句,initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db也是。

理解NSStringchar*字符串之间的区别很重要。NSString是一个成熟的对象,它支持大约50个方法来对字符串值做各种各样的整洁/奇怪/(偶尔)令人讨厌的事情。这两者在任何方面都不能互换。与某些c++库不同,您不能在调用时将char*字符串替换为NSString字符串并自动进行转换。

所以使用"letters"的字符串不会产生一些可用的NSString -你必须使用@"letters"

在NSLog中打印时,NSString应该是%@而不是%s

最新更新