从C函数返回接受两个字符串的字符串

时间:2016-07-15 16:01:40

标签: c compiler-errors

原谅我的新生儿!我试图创建一个接受两个char数组作为参数的函数,并返回一些JSON。这是我的代码,然后是编译警告。该程序只是在执行时段错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char get_json(char *sid, char *obuf)
{
        char *json;
        json = malloc(strlen(obuf)+37);
        strcpy(json, "{\"sessionline\":{\"sid\":\"");
        strcat(json, sid);
        strcat(json, "\",\"line\":\"");
        strcat(json, obuf);
        strcat(json, "\"}}");
        return json;
}

int main()
{
        char *sid = "xyzxyzxyz";
        char *obuf = "asdfasdfasdfasdf";
        char *json = get_json(sid, obuf);
        printf(json);
}

使用gcc编译时:

test.c: In function ‘get_json’:
test.c:14:9: warning: return makes integer from pointer without a cast [enabled by default]
         return json;
         ^
test.c: In function ‘main’:
test.c:21:22: warning: initialization makes pointer from integer without a cast [enabled by default]
         char *json = get_json(sid, obuf);
                      ^
test.c:22:9: warning: format not a string literal and no format arguments [-Wformat-security]
         printf(json);
         ^

2 个答案:

答案 0 :(得分:1)

  • get_json应该返回指针char*,而不是char
  • 您忘记将sid包含在要分配的长度中,因此您的程序将导致超出范围的访问并调用未定义的行为
  • 程序没有任何损害,但通常将用户的字符串放入格式字符串printf()是危险的。

试试这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char get_json(char *sid, char *obuf)
{
        char *json;
        json = malloc(strlen(sid)+strlen(obuf)+37);
        if(json == NULL) return json;
        strcpy(json, "{\"sessionline\":{\"sid\":\"");
        strcat(json, sid);
        strcat(json, "\",\"line\":\"");
        strcat(json, obuf);
        strcat(json, "\"}}");
        return json;
}

int main(void)
{
        char *sid = "xyzxyzxyz";
        char *obuf = "asdfasdfasdfasdf";
        char *json = get_json(sid, obuf);
        if (json != NULL) fputs(json, stdout);
}

或更简单:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char get_json(char *sid, char *obuf)
{
        char *json;
        json = malloc(strlen(sid)+strlen(obuf)+37);
        if(json == NULL) return json;
        sprintf(json, "{\"sessionline\":{\"sid\":\""
                "%s"
                "\",\"line\":\""
                "%s"
                "\"}}", sid, obuf);
        return json;
}

int main(void)
{
        char *sid = "xyzxyzxyz";
        char *obuf = "asdfasdfasdfasdf";
        char *json = get_json(sid, obuf);
        if(json != NULL) fputs(json, stdout);
}

答案 1 :(得分:0)

您将char *作为char返回。

您的函数声明应如下所示:

char* get_json(char *sid, char *obuf)

考虑到它的大小,你似乎也会把更多东西放到json中。

发生段错误是因为在从char*char的转换中,数字被截断为1B,因此printf(json)尝试读取0到255之间的某个字节的内存,以前不保留。