我必须编写一个程序,它可以接受这样的输入:
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语言,所以如果这是一个愚蠢的问题,我很抱歉=)
发布于 2012-01-20 15:31:24
这一行:
sql = "";将导致char*变量'sql‘指向字符串文字"“的地址。然后使用sql调用strcat(sql,str)并指向该文本的地址是不正确的;这甚至可能会出现segfault。相反,尝试:
strcpy(sql, "");或等同于
sql[0] = 0此外,您没有显示“sql”的定义位置,但它必须指向一个足够大的缓冲区,以容纳您期望遇到的尽可能多的相邻行。
https://stackoverflow.com/questions/8937827
复制相似问题