2013-04-15 24 views
3

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

我面临的问题是char *字段的值为NULL。 如果有一个

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

和foo_field可能会或可能不会NULL

MySQL需要收到一个普通的NULL,而不是"NULL",所以我必须在有NULL值时删除双引号。当值不是NULL时,它必须用双引号括起来。

因为我已经证明我可以放置一个if then,使得参数是%s如果NULL\"%s\"如果不是NULL的情况。

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

+0

'if(foo_field)printf((“\”%s \“”,foo_field); else printf(“NULL”);' – BLUEPIXY

+0

为什么你认为if-else不是一个好选择? – SuperSaiyan

+0

打印只有文本字符串还是打印数字? –

回答

-1

所以,你的问题是,如果 - 然后多次是丑陋的?

功能如何?

void print_field (const char *field) { 
    if (field) 
    printf ("\"%s\" ", field); 
    else 
    printf ("NULL "); 
} 

然后在您的实际代码:

print_field (foo_field); 
print_field (bar_field); 
...... 

如果您确保该功能在同一个文件(static声明),则编译器可能会内联的,如果判断是更高效。

+0

向下投票没有解释?这很有帮助! – ams

+0

我想你错过了一个事实,那就是可能需要更复杂的printf语句,比如'printf(“%d%s%s%f%d%s”,...);' –

+0

这就是Alexey的情况,在某些sql命令中大约有20个字段 – Luis

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); 
1

咳咳。 咳嗽 ...

注意的printf("%s")空指针的行为是不确定的

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

这就是为什么C/C++的信条是为了而不是将安全网络添加到标准功能。该库不仅在你的指针上执行if-else以免你崩溃。不,如果你想玩它安全,你添加另一个if - else以便不依赖于实施...