我正在编写一个程序来打印出数千行(MySQL)SQL指令,这些指令将在异步时间内发送到数据库服务器。 每组SQL指令将通过* nix管道重定向保存到文件中。
我遇到的问题是NULL
字段的char *
值。
如果有
printf ( "\"%s\" ", foo_field);
和foo_field可能是也可能不是NULL
。
MySQL需要接收普通NULL
,而不是"NULL"
,因此我必须在有NULL
值时删除双引号。当值不是NULL
时,必须用双引号括起来。
对于我已展示的情况,我可以放置if then
,以便参数在%s
时为NULL
,如果不是\"%s\"
则为NULL
。
但是如果我们考虑一个包含20个字段的SQL行,那么这样做并不是那么好。我怎么能做到这一点?
答案 0 :(得分:1)
咳咳。 咳嗽 ...
请注意{NULL}指针的printf( "%s" )
行为未定义。
不是在任何NULL
或null
或nil
或空字符串周围是否有引号的意义上,但在某种意义上,您的应用程序可能只会崩溃。
这就是为什么C / C ++的信条是不为标准功能添加安全网。库不仅可以在指针上执行if
- else
,还可以避免崩溃。不,如果你想安全地玩,你 添加另一个 if
- else
,以便不依赖于实施。
答案 1 :(得分:0)
确保foo_field是一个字符数组,至少比字段长2个字符。
void add_quotes_unless_NULL(char* str)
{
if (strncmp("NULL", str, 5) != 0)
{
char prev = str[0];
str[0] = '\"';
int i;
for (i = 1; prev; ++i)
{
char curr = str[i];
str[i] = prev;
prev = curr;
}
str[i] = '\"';
str[i+1] = '\n';
}
}
现在以这种方式使用它:
add_quotes_unless_NULL(foo_field);
printf ( "%s ", foo_field);
答案 2 :(得分:-1)
所以,你的问题是if-then-else多次丑陋?
一个功能怎么样?
void print_field (const char *field) {
if (field)
printf ("\"%s\" ", field);
else
printf ("NULL ");
}
然后在您的真实代码中:
print_field (foo_field);
print_field (bar_field);
......
如果你确定该函数在同一个文件中(用static
声明),那么编译器可能会内联它,如果它判断它更有效。