从SQLite取数时参数与三元运算符的工作原理及字段分隔问询
嘿,我来帮你拆解这两个问题~
问题解析与修复建议
先看你当前的输出,每个字段后面都跟着b,这其实是代码里的一个小失误导致的,咱们一步步理清疑问:
1. 行中字段的分隔逻辑
你代码里的字段分隔是靠callback函数里的printf("%s b", ...)实现的——这里的b明显是个笔误(大概率是想写空格或者制表符这类分隔符),所以才会让每个字段后面都跟着b。
如果想要正常的字段分隔(比如用空格隔开),只需要把格式字符串改成"%s ",这样每个字段后会输出空格,就能得到符合预期的分隔效果了。
2. 三元运算符的作用(和字段分隔的关系)
代码里的argv[i]?argv[i]:"NULL"这个三元运算符根本不是用来做字段分隔的,它的核心作用是处理空值:
- 当当前字段有值时(
argv[i]不为空指针),就输出字段的实际内容; - 当字段值为
NULL时(argv[i]是空指针),就输出字符串"NULL",避免直接打印空指针导致程序崩溃或者乱码。
字段分隔的逻辑完全在printf的格式字符串里,和这个三元运算符没有关系。
修复后的示例代码
把格式字符串里的b改成空格,就能得到正常的输出:
int callback(void *NotUsed, int argc, char **argv, char **azColName) { NotUsed = 0; for (int i = 0; i < argc; i++) { printf("%s ", argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; }
执行后输出就会变成:
1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
如果想更严谨(去掉行尾多余的空格),可以调整下打印逻辑:
int callback(void *NotUsed, int argc, char **argv, char **azColName) { NotUsed = 0; for (int i = 0; i < argc; i++) { if (i > 0) printf(" "); // 只有非第一个字段,前面才加空格分隔 printf("%s", argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者Ken Graham
相关产品推荐
相关产品推荐

