printf NULL没有引号或不是NULL,带有sql语句的引号

时间:2013-04-15 12:18:19

标签: c printf

我正在编写一个程序来打印出数千行(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行,那么这样做并不是那么好。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:1)

咳咳。 咳嗽 ...

请注意{NULL}指针的printf( "%s" )行为未定义

不是在任何NULLnullnil或空字符串周围是否有引号的意义上,但在某种意义上,您的应用程序可能只会崩溃。

这就是为什么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声明),那么编译器可能会内联它,如果它判断它更有效。