C,使用文本文件保存/读取NULL

时间:2012-02-05 23:28:56

标签: c

在下列情况下,我无法摆脱编译器警告“赋值从整数中生成指针”:

    int sql_user(char** mysql_user_name, char** mysql_password, char** mysql_server, char **mysql_serverport, char** mysql_socket)
{
    int retval = -1;
    char **sub;
    char *contents;
    if(g_file_get_contents("mysqlsrv.def", &contents, NULL, NULL))
    {
        sub = g_strsplit(contents, "\n", -1);
        //here compiler warning: assignment makes pointer from integer without a cast

        *mysql_user_name  = sub[0];
        *mysql_password   = sub[1];
        *mysql_server     = sub[2];
        *mysql_serverport = sub[3];
        *mysql_socket     = sub[4];
        if (!strlen(sub[4])) *mysql_socket = NULL;
        retval = 0;
    }
    return retval;
}

另外,在sub [4]中是空字符串(“”)。这里有一种方法可以将NULL保存到文本文件中,以便以后可以将其作为NULL而不使用If(!strlen ... condition?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:5)

听起来像g_strsplit()是未知的(声明的),因此编译器假设默认返回类型为int。 我会检查你的包含文件,以确保包含声明g_strsplit()的文件。

答案 1 :(得分:2)

不,没有将NULL保存到文本文件的通用方法,您需要决定在配置文件中对它进行编码的方式。

在这种特殊情况下,最简单的方法就是建议if(!strlen(sub[4]))

如果您想拥有支持NULL的配置文件格式,我建议使用标记语言或编码格式,例如YAMLJSONINI或{{3}这样你可以使用现有的库,避免重新发明轮子。

由于你已经是Gnome lib,Protocol Buffers将是一个不错的选择。

答案 2 :(得分:1)

g_strsplit函数未在源文件中声明,并且函数的隐式声明由编译器生成。隐含的声明是这样的:

/* function that takes an unspecified number of parameters and retuns an int */
extern int g_strsplit();

要解决此问题,请添加g_strsplit功能的相关标头:

#include <glib.h>
#include <glib/gprintf.h>