C 从db表检索数据时,参数和三元运算符是如何工作的?

C 从db表检索数据时,参数和三元运算符是如何工作的?,c,sqlite,loops,for-loop,c-strings,C,Sqlite,Loops,For Loop,C Strings,该程序使用c从sqlite中的数据库检索整个表 数据库表 "1" "Audi" "52642" "2" "Mercedes" "57127" "3" "Skoda" "9000" "4" "Volvo" "29000" "5" &quo

该程序使用c从sqlite中的数据库检索整个表

数据库表

"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;
}
我发现表中的行是作为参数传递的。但是,是什么将每个字段分隔成一行呢?三元运算符是如何分离字段的

输出

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
函数
回调中的循环

for (int i = 0; i < argc; i++) {

    printf("%s b", argv[i]?argv[i]:"NULL");
}

printf("\n");
所以这个循环

for (int i = 0; i < argc; i++) {

    printf("%s b", argv[i]?argv[i]:"NULL");
}

printf("\n");
下面是一个使用函数
回调
的演示程序。我只注释了未使用的参数

#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;
}

因此,函数
回调
接受指向每个读取记录中字段的指针数组。

三元运算符不分隔字段。它只输出存储在argv[i]中的字符串或字符串文本“NULL”。似乎每个字符串argv[i]都包含一个字段。但是当我写入
printf(“%s”,argv[i])我得到o/p
1Audi52642
。它是如何在元素上迭代的?不,您在回调中得到了
“1b”
“Audi b”
“52642b”
。您似乎误解了回调的工作方式。将为表的每一行调用函数,并在数组的元素中传递每个字段。No。argv[0]是1Audi52642。argv[1]是2 mercedes57127。argv是一个二维数组,但当我使用argv[i][0]时,我得到的int值可能是指针值。@KenGraham你错了。在函数回调中,有一个指向字符串argv的指针数组。这个数组在for循环中被遍历。@KenGraham您的代码示例和输出清楚地显示
argv[0]
只包含
“1”
是。我的错。我在学习的时候会在某个地方犯错误。
for (int i = 0; i < argc; i++) {

    printf("%s b", argv[i]?argv[i]:"NULL");
}

printf("\n");
1 bAydi b52642 b
#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