我有麻烦通过函数调用传递/接收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
也是。
理解NSString
和char*
字符串之间的区别很重要。NSString是一个成熟的对象,它支持大约50个方法来对字符串值做各种各样的整洁/奇怪/(偶尔)令人讨厌的事情。这两者在任何方面都不能互换。与某些c++库不同,您不能在调用时将char*
字符串替换为NSString
字符串并自动进行转换。
所以使用"letters"
的字符串不会产生一些可用的NSString -你必须使用@"letters"
在NSLog中打印时,NSString应该是%@而不是%s