2016-07-15 9 views
-3

Verzeihen Sie meine C newbness! Ich versuche, eine Funktion zu erstellen, die zwei Char-Arrays als Argumente akzeptiert und JSON zurückgibt. Hier ist mein Code, gefolgt von Kompilierungswarnungen. Das Programm segmentiert einfach bei der Ausführung.Return String von C-Funktion akzeptiert zwei Strings

#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); 
} 

Wenn mit gcc kompilieren:

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

Sie haben vergessen, '*' in Funktion Rückgabetyp. – xinaiz

+0

Sie können alle diese Funktionen vereinfachen, indem Sie sprintf() verwenden – nosbor

+0

Sieht aus wie ein Tippfehler. 'char get_json (char * sid, char * obuf)' sollte 'char * get_json (char * sid, char * obuf)' sein. Notieren Sie das '*' auf dem Rückgabetyp. – NathanOliver

Antwort

0

Sie sind ein char * als Zeichen zurück.

Ihre Funktionsdeklaration sollte wie folgt aussehen:

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

Sie scheinen auch mehr Material in json zu setzen, als es aufgrund seiner Größe passen.

Die segfault geschieht, weil bei der Umwandlung von char* zu char die Nummer 1B abgeschnitten wird, so printf(json) versucht einige Byte Speicher zwischen 0 zu lesen - 255, die es vorher nicht behalten hat.

+1

Tippfehler Fragen sollten geschlossen werden. Sie sollten abstimmen/zum Schließen ankreuzen, anstatt zu antworten. – NathanOliver

+0

Ordnet diese Zeile nicht beide * sid und * obuf-Längen der json-Variable zu? json = malloc (strlen (sid) + stralen (obuf) +37); Die 37 ist der Rest der statischen json - sid und obuf würde dynamische Größen sein. – Cotton

+0

@Cotton ja es tut, aber in Ihrer Frage haben Sie die Linie 'malloc (strlen (obuf) +37)' – Annonymus

1
  • get_json sollte einen Zeiger char* zurückkehren, nicht char.
  • Sie haben vergessen, sid zu der Länge zuzuweisen, um zu reservieren, so dass Ihr Programm außerhalb des Bereichs Zugriff verursacht und undefined Verhalten aufrufen.
  • Es gibt keinen Schaden in dieses Programm, aber gefährlicher Zeichenfolge aus Benutzern in das Formatstring von printf() ist in der Regel setzen.

Versuchen Sie folgendes:

#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); 
} 

oder einfacher diese:

#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

Danke für die zusätzlichen Tipps. – Cotton