3

我正在编写一个程序来打印出数千行(MySQL)SQL 指令,以异步时间发送到数据库服务器。每组 SQL 指令都将通过 *nix 管道重定向保存到文件中。

我面临的问题是关于字段的NULLchar *。如果有一个

printf ( "\"%s\" ", foo_field);

和 foo_field 可能是也可能不是NULL

MySQL 需要接收一个 plain NULL,而不是 a "NULL",所以我必须在有值的时候去掉双引号NULL。当值不是NULL时,必须用双引号括起来。

对于我展示的情况,我可以放置 aif then以便参数为%sifNULL\"%s\"if not NULL

但是如果我们考虑一个有 20 个字段的 SQL 行,那么这样做就不是很好了。我怎样才能做到这一点?

4

3 回答 3

1

咳咳。...

请注意printf( "%s" )for NULL 指针的行为是undefined

NULL不是在任何or nullor or nilor 空字符串周围是否会有引号,而是从某种意义上说,您的应用程序可能会简单地崩溃。

这就是为什么 C/C++ 的信条是向标准函数添加安全网的原因。该库不仅在您的指针上执行if-else以使您免于崩溃。不,如果您想安全起见,则必须添加另一个 if-else以免依赖于实现...

于 2013-04-15T12:57:00.307 回答
0

确保 foo_field 是一个 char 数组,至少比您的字段长 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);
于 2013-04-15T12:42:02.403 回答
-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),那么编译器可能会内联它,如果它判断它更有效的话。

于 2013-04-15T12:26:30.287 回答