ios - 无法在结构中传递C字符串

标签 ios objective-c string

我在从传递的结构中获取char *字符串时遇到麻烦。我有以下代码:

typedef struct {
    NSInteger id;
    char *title;
} Movie;

...

Movie movie = [self randomMovie];

NSInteger movieID = movie.id;
NSString *movieTitle = [NSString stringWithUTF8String:movie.title];
NSLog(@"movieTitle: %@", movieTitle);

...

- (Movie)randomMovie {
sqlite3_stmt *statement;
NSString *query = @"SELECT id, title FROM movies ORDER BY RANDOM() LIMIT 1;";

Movie movie;

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    if (sqlite3_step(statement) == SQLITE_ROW) {
        // Get the id and title of the first
        movie.id = sqlite3_column_int(statement, 0);
        movie.title = (char *)sqlite3_column_text(statement, 1);
    }
}

NSLog(@"Random movie %d title: %@", movie.id, [NSString stringWithUTF8String:movie.title]);

sqlite3_finalize(statement);
return movie;
}

这给了我输出:
2013-03-13 10:10:39.438 Fabflix[89156:c07] Random movie 872011 title: Ray
2013-03-13 10:10:39.439 Fabflix[89156:c07] movieTitle: (null)

有谁知道为什么没有从randomMovie正确传递标题字符串?谢谢!

最佳答案

我对sqlite3 C API并不十分熟悉,但是您确定sqlite3_finalize()调用不会破坏sqlite3_column_text()返回的C字符串吗?您可能需要对该事物进行strdup()(然后记住,稍后再对其进行free())。

:从文档中更新:是的:

返回的指针有效,直到如上所述发生类型转换,或者直到调用sqlite3_step()或sqlite3_reset()或sqlite3_finalize()为止。用于保存字符串和BLOB的内存空间会自动释放。

关于ios - 无法在结构中传递C字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392008/

相关文章:

c++ - 如果 C/C++ 中的字符串没有 NUL 字符(以防编译器允许它通过),会发生什么情况?

javascript - 如何将换行符/回车符插入到 element.textContent 中?

来自 [String : AnyObject] 的 iOS Swift 值

ios - SwiftUI 更新导航栏标题颜色

iphone - EXC_BREAKPOINT 崩溃。可能越狱问题?

objective-c - EKCalendarChooser 多项选择不起作用

objective-c - 如何解析出每个汉字?

java - 从不断变化的字符串中获取子字符串

ios - 没有这样的模块 "PackageDescription"Swift 3 Xcode 8

ios - 如何在 UICollectionView 上动态实现 Sections?