str while在

时间:2012-01-20 06:58:42

标签: c postgresql

我必须制作一个可以接受这样输入的程序:

2012-01-20 10:50:52 127.0.0.1(via UDP: [127.0.0.1]:65008->[0.0.0.0]:0) TRAP, SNMP v1, community telros
        SNMPv2-SMI::enterprises.3.1.1 Enterprise Specific Trap (1) Uptime: 73 days, 21:16:00.11

2012-01-20 10:50:53 127.0.0.1(via UDP: [127.0.0.1]:57487->[0.0.0.0]:0) TRAP, SNMP v1, community telros
        SNMPv2-SMI::enterprises.3.1.1 Enterprise Specific Trap (1) Uptime: 73 days, 21:16:01.15

2012-01-20 10:50:54 127.0.0.1(via UDP: [127.0.0.1]:34207->[0.0.0.0]:0) TRAP, SNMP v1, community telros
        SNMPv2-SMI::enterprises.3.1.1 Enterprise Specific Trap (1) Uptime: 73 days, 21:16:01.92

然后把它放到Postgres中:得到两行由空(\n)行划分并放入db表中。

我要做的是:

const char *conninfo;
const char *paramValues[1]; 
char *str;
char *sql;
...
while(fgets(str, 126, stdin)) {

        if (0 != strcmp(str,"\n")){
        strcat(sql,str);
        }else{
        paramValues[0] = (const char *)sql;
        res = PQexecParams(conn,
            "insert into traps (trap_content, trap_timestamp) values ($1, localtimestamp);",
            1,
            NULL,
            paramValues,
            NULL,
            NULL,
            1);
        sql = "";
        }
    }

paramValues[0]似乎在插入时为空,表格中出现空行。

如何才能在paramValues[0]中的空字符串之前获得两个字符串? 我不擅长C,很抱歉,如果这是一个愚蠢的问题=)

1 个答案:

答案 0 :(得分:1)

这一行:

sql = "";

将导致char *变量'sql'指向字符串文字“”的地址。用sql调用strcat(sql,str)现在指向这个文字的地址是不正确的;甚至可能是段错误。请尝试改为:

strcpy(sql, "");

或等效

sql[0] = 0

此外,您没有显示'sql'的定义位置,但它必须指向一个足够大的缓冲区,以容纳您预期遇到的相邻数量的行。