从数据库 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 接受指向每个读取记录中的字段的指针数组。