2016-07-15 10 views
-3

私のCの新しさを許してください!引数として2つのchar配列を受け取り、いくつかのJSONを返す関数を作成しようとしています。ここに私のコード、コンパイルの警告が続きます。このプログラムは、実行時に単に重複します。 2つの文字列を受け入れるC関数の文字列を返します

#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でコンパイルする:あなたはcharとしてのchar *を返すされている

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); 
     ^
+0

あなたは関数の戻り値の型では、 '*'忘れてしまったが。 – xinaiz

+0

sprintf()を使用すると、これらの機能をすべて簡略化できます。 – nosbor

+0

タイプミスのようです。 'char get_json(char * sid、char * obuf)'は 'char * get_json(char * sid、char * obuf)'でなければなりません。戻り値の型の '*'に注意してください。 – NathanOliver

答えて

0

あなたの関数の宣言は次のようになります。

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

また、それは、そのサイズ与え合うことができるよりもjsonに多くのものを入れているようです。それは以前に予約していなかった255、 - char*からcharへの変換に数が0との間のメモリのいくつかのバイトを読み取るために、図1Bにのでprintf(json)試行を切り捨てているため

セグメンテーション違反が起こります。

+1

タイプミスの質問は閉じなければなりません。あなたは答える代わりに閉会のために投票/旗を立てるべきです。 – NathanOliver

+0

この行は、* sidと* obufの両方の長さをjson変数に割り当てませんか? json = malloc(strlen(sid)+ strlen(obuf)+37); 37は静的なjson-sidの残りの部分で、obufは動的なサイズになります。 – Cotton

+0

@Cottonはい、それはありますが、あなたの質問では 'malloc(strlen(obuf)+37)' – Annonymus

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); 
} 
+0

追加情報をありがとう。 – Cotton

関連する問題