我在通过函数调用传递/接收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.m中的函数,如上所述...
- (id) initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db{
printf("'%i', '%s', '%s'", pk, nam, descrip);
.
.
.
return self;
}
假设我用输入1234,“树”,“带叶子的植物”调用addTo
第一个代码块中的打印输出我发送给addTo的内容,但initWithPrimaryKey中的print打印出以下内容...
'1234', 'P?a', 'P?a'
这是为什么?或者更多..为什么不打印我期望的东西?
答案 0 :(得分:0)
在NSLog中打印时,NSString应为%@ not%s
答案 1 :(得分:0)
%s
用于char*
字符串,但%@
应与NSStrings一起使用。我不知道printf
可能支持也可能不支持%@
。如果没有,您需要使用NSString的cStringUsingEncoding或UTF8String转换为您可以使用的char*
。
initWithPrimaryKey:pk:nam:descrip:db
无效(或至少非常循环)语法,BTW,initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db
。
了解NSString
和char*
字符串之间的区别非常重要。 NSString是一个成熟的对象,它支持大约50种方法,可以使用字符串值来处理所有类型的整洁/奇怪/(偶尔)淫秽的东西。这两者在任何方面都不可互换。与某些C ++库不同,您无法在调用中用char*
字符串替换NSString
并自动进行转换。
因此,使用"letters"
作为字符串将不会产生可用作NSString的内容 - 您必须使用@"letters"
。