从数据库 table 检索数据时,参数和三元运算符如何工作?
How do the arguments and ternary operator work when retrieving data from a db table?
该程序是关于使用 c.
从 sqlite 数据库中检索整个 table
DB table
"1" "Audi" "52642"
"2" "Mercedes" "57127"
"3" "Skoda" "9000"
"4" "Volvo" "29000"
"5" "Bentley" "350000"
"6" "Citroen" "21000"
"7" "Hummer" "41400"
"8" "Volkswagen" "21600"
计划
#include <sqlite3.h>
#include <stdio.h>
int callback(void *, int, char **, char **);
int main(void) {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("db1.db", &db);
char *sql = "SELECT * FROM Cars";
rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
sqlite3_close(db);
return 0;
}
int callback(void *NotUsed, int argc, char **argv,
char **azColName) {
NotUsed = 0;
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
return 0;
}
有问题的操作
printf("%s b", argv[i]?argv[i]:"NULL");
我知道 table 的行作为参数传递。但是,是什么将每一行中的每个字段分开的呢?三元运算符如何分隔字段?
输出
1 bAudi b52642 b
2 bMercedes b57127 b
3 bSkoda b9000 b
4 bVolvo b29000 b
5 bBentley b350000 b
6 bCitroen b21000 b
7 bHummer b41400 b
8 bVolkswagen b21600 b
考虑到此行的输出
1 bAudi b52642 b
和函数中的循环callback
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
好像每个字符串argv[i]
如果不等于NULL
都指向一个字段,按行输出。例如,对于第一行,指向的字符串 argv[0]
包含 "1"
,argv[1]
包含 "Audi"
,argv[2]
包含 "52642"
。`
所以假设 argc
等于 3
并且 argv
是动态(或自动)分配的指向字符串的指针数组,例如
{ "1", "Audi", "52642" }
所以这个循环
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
将输出行
1 bAydi b52642 b
这是一个使用您的函数的演示程序 callback
。我只评论了未使用的参数。
#include <stdio.h>
int callback( /*void *NotUsed,*/ int argc, char **argv /*, char **azColName*/ ) {
// NotUsed = 0;
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
return 0;
}
int main(void)
{
enum { argc = 3 };
char *argv[argc] =
{
"1", "Audi", "52642"
};
callback( argc, argv );
return 0;
}
程序输出为
1 bAudi b52642 b
因此函数 callback
接受指向每个读取记录中的字段的指针数组。
该程序是关于使用 c.
从 sqlite 数据库中检索整个 tableDB table
"1" "Audi" "52642"
"2" "Mercedes" "57127"
"3" "Skoda" "9000"
"4" "Volvo" "29000"
"5" "Bentley" "350000"
"6" "Citroen" "21000"
"7" "Hummer" "41400"
"8" "Volkswagen" "21600"
计划
#include <sqlite3.h>
#include <stdio.h>
int callback(void *, int, char **, char **);
int main(void) {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("db1.db", &db);
char *sql = "SELECT * FROM Cars";
rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
sqlite3_close(db);
return 0;
}
int callback(void *NotUsed, int argc, char **argv,
char **azColName) {
NotUsed = 0;
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
return 0;
}
有问题的操作
printf("%s b", argv[i]?argv[i]:"NULL");
我知道 table 的行作为参数传递。但是,是什么将每一行中的每个字段分开的呢?三元运算符如何分隔字段?
输出
1 bAudi b52642 b
2 bMercedes b57127 b
3 bSkoda b9000 b
4 bVolvo b29000 b
5 bBentley b350000 b
6 bCitroen b21000 b
7 bHummer b41400 b
8 bVolkswagen b21600 b
考虑到此行的输出
1 bAudi b52642 b
和函数中的循环callback
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
好像每个字符串argv[i]
如果不等于NULL
都指向一个字段,按行输出。例如,对于第一行,指向的字符串 argv[0]
包含 "1"
,argv[1]
包含 "Audi"
,argv[2]
包含 "52642"
。`
所以假设 argc
等于 3
并且 argv
是动态(或自动)分配的指向字符串的指针数组,例如
{ "1", "Audi", "52642" }
所以这个循环
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
将输出行
1 bAydi b52642 b
这是一个使用您的函数的演示程序 callback
。我只评论了未使用的参数。
#include <stdio.h>
int callback( /*void *NotUsed,*/ int argc, char **argv /*, char **azColName*/ ) {
// NotUsed = 0;
for (int i = 0; i < argc; i++) {
printf("%s b", argv[i]?argv[i]:"NULL");
}
printf("\n");
return 0;
}
int main(void)
{
enum { argc = 3 };
char *argv[argc] =
{
"1", "Audi", "52642"
};
callback( argc, argv );
return 0;
}
程序输出为
1 bAudi b52642 b
因此函数 callback
接受指向每个读取记录中的字段的指针数组。