2016-07-15 238 views
-3

原諒我的C新手!我試圖創建一個接受兩個char數組作爲參數的函數,並返回一些JSON。這是我的代碼,然後是編譯警告。該程序在執行時會簡單地發生段錯誤。從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編譯:

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 *爲char。

你的函數聲明應該是這樣的:

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

也似乎把更多的東西到json比它可以容納鑑於其規模。

的段錯誤發生,因爲在從char*char轉換的數量被截斷爲1B,所以printf(json)嘗試讀取的0之間的存儲器一些字節 - 255,它沒有先前預留。

+1

Typo問題應該被關閉。你應該投票/標誌結束而不是回答。 – 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