Forum: Mikrocontroller und Digitale Elektronik String enthält Gänsefüßchen


von Attila C. (attila)


Lesenswert?

Hallo!

Ich möchte ein json mit C auswerten. Beispiel:

{"time":1622204790,"states":[["3c6668","DLH1TN 
","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35 
6.55,0,null,11864.34,"1000",false,0]}

Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht 
wird das 2te " als das Ende des Strings interpretiert und es gibt eine 
Fehlermeldung.

Wie macht man das?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

C-Sourcecode? Mit
1
\"
 notieren.

: Bearbeitet durch Moderator
von c-hater (Gast)


Lesenswert?

Attila C. schrieb:

> Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht
> wird das 2te " als das Ende des Strings interpretiert und es gibt eine
> Fehlermeldung.
>
> Wie macht man das?

Du meinst vermutlich eigentlich nicht "einlesen", sondern dass du dieses 
char-Array mit einem String-Literal initialisieren möchtest, welches 
Anführungszeichen enthalten muss.

Da muss man "escapen". Es gibt mehrere Möglichkeiten, dies zu tun, die 
kürzeste ist: mache aus jedem " im String ein
1
\"
.

(Edit: [c]-Tag eingefügt, weil sonst der Backslash zumindest in der 
mobilen Darstellung nicht sichtbar ist. - Mod.)

: Bearbeitet durch Moderator
von Attila C. (attila)


Lesenswert?

Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer 
API erhalte kann ich es nicht umschreiben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Attila C. schrieb:
> Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer
> API erhalte kann ich es nicht umschreiben.

Dann beschreibe mal exakt, was du tun willst.

Ist das C-Quellcode, der compiliert werden soll? Dann geht das einfach 
nicht.

Willst du das wirklich einlesen, also irgendwie mit fgets() oder 
dergleichen? Dann interessieren die Quotes erstmal gar nicht.

von Stefan F. (Gast)


Lesenswert?

In viele IDEs kannst du mit einem leeren String anfangen und dieses JSON 
Dokument dann über die Zwischenablage einfügen:

char test[]="";

Anführungsstriche und Zeilenumbrüche werden dann von der IDE automatisch 
escaped.

von Alter Sack (Gast)


Lesenswert?

Attila C. schrieb:
> Hallo!
>
> Ich möchte ein json mit C auswerten. Beispiel:
>
> {"time":1622204790,"states":[["3c6668","DLH1TN
> ","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35 
6.55,0,null,11864.34,"1000",false,0]}

Das mit dem escapen ist ja schon erklärt worden.

Aber soweit ich das sehe ist das Zeugs sowieso kaputt, weil der Wert von 
"states" (ein Array) mit zwei eckigen Klammern anfängt wo nur eine sein 
sollte.

Ich würde mir erstmal ein ordentliches API zur Lieferung dieser Daten 
suchen, sonst hat man nur begrenzt Spass damit...

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Attila C. schrieb:
> Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer
> API erhalte kann ich es nicht umschreiben.

Das betrifft Dich doch nur dann, wenn Du das Ergebnis der API in einen 
C-Quellcode übernehmen willst. Wenn Du es in ein String "einliest", ist 
das Wumpe. Es sollte nur kein NULL enthalten sein.

von Udo S. (urschmitt)


Lesenswert?


von verstehe ich nicht (Gast)


Lesenswert?

Attila C. schrieb:
> Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht
> wird das 2te " als das Ende des Strings interpretiert und es gibt eine
> Fehlermeldung.

Warum eigentlich zu Recht?

man kann doch mit fgets(...) alles einlesen. Auch z.B. Zeilen wie
1
/* auch das wird eingelesen */ "und" "das" "erst" "recht"

von Rolf M. (rmagnus)


Lesenswert?

Attila C. schrieb:
> und es gibt eine Fehlermeldung.

WELCHE?

von Marco H. (damarco)


Lesenswert?

Das JSON ist nicht valid... https://jsonlint.com/ kann man hier prüfen.

Dein Problem ist das Object States welchen ein Array enthält und dieses 
Array ein weiteres Array. Mehrdimensionale Arrays sind im JSON möglich, 
aber nicht so...


Alle Zeichen die in der c Funktion Verwendung finden müssen entwertet 
werden..

Andererseits müssen auch alle Zeichen die dein JSON zerstören ebenfalls 
beim ausgeben entwendet werden.

: Bearbeitet durch User
von quotendepp (Gast)


Lesenswert?

Marco H. schrieb:
> Mehrdimensionale Arrays sind im JSON möglich, aber nicht so...

ähm wie meinen?
1
[[0]]
ist absolut valides json. beim beispiel im ersten beitrag ist ein array 
nicht geschlossen. ja, ist invalid aber weil das array nicht 
abgeschlossen ist...

von Sebastian W. (wangnick)


Lesenswert?

Attila C. schrieb:
> Ich möchte ein json mit C auswerten. Beispiel:
>
> {"time":1622204790,"states":[["3c6668","DLH1TN
> ","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35
> 6.55,0,null,11864.34,"1000",false,0]}
>
> Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht
> wird das 2te " als das Ende des Strings interpretiert und es gibt eine
> Fehlermeldung.
>
> Wie macht man das?

Hallo Attila,

die Auswertung von Json in C ist problemlos möglich.

Die Beschreibung deines Problems ist aber sehr schwer zu verstehen. Zum 
einen ist dein Json-Beispiel kein gültiges Json. Aber noch schwerer zu 
verstehen ist der zweite Teil, wo du sagst, dass das zweite 
Anführungszeichen als Ende des Strings interpretiert wird. 
Anführungszeichen werden in C zur Laufzeit nicht als Ende eines Strings 
interpretiert; sie werden im Quellcode für Anfang und Ende von 
String-Literalen benutzt und dann vom Compiler interpretiert.

Um dir helfen zu können solltest du dein Problem noch mal genauer 
beschreiben.

LG, Sebastian

von Attila C. (attila)


Lesenswert?

Also:

Das mit dem Json hat sich erledigt, ich habe so viele dämliche Fehler 
gemacht dass es mir zu peinlich ist sie hier zu beschreiben. Dennoch:

Wenn ich hier:

https://www.onlinegdb.com/online_c_compiler

Diesen Code eingebe:

#include <stdio.h>

char[20] = "abc"123"ABC"

int main()
{
    printf("Hello World");

    return 0;
}

Kommt:

Compilation failed due to following error(s).

 char[20] = "abc"123"ABC"
     ^

von Attila C. (attila)


Lesenswert?

Auuuaaaaaaa! So jetzt nochmal:

char  c[] = "abc"123"ABC";

int main()
{
    printf("Hello World");

    return 0;
}

Der Error:

 char  c[] = "abc"123"ABC";
                  ^~~

von da und dort (Gast)


Lesenswert?

Attila C. schrieb:
> ich habe so viele dämliche Fehler gemacht

Und hier gleich noch einen. Hinweis: Variablen Typ dann Namen.

Attila C. schrieb:
> Auuuaaaaaaa! So jetzt nochmal

Berichterstattungen sind schön, aber hier erwarten wir Fragen.
Ich sehe keine Frage.

von Attila C. (attila)


Lesenswert?

Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen 
innerhalb von Anfangs und End Gänsefüßchen einzulesen?

von Einer (Gast)


Lesenswert?

Attila C. schrieb:
> Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen
> innerhalb von Anfangs und End Gänsefüßchen einzulesen?

Das ist kein EINLESEN das nennt man Compilieren.

Das was du willst gibt die Syntax nicht her.

von da und dort (Gast)


Lesenswert?

Attila C. schrieb:
> Wie bewegt man das char array dazu die Gänsefüßchen
> innerhalb von Anfangs und End Gänsefüßchen einzulesen?

Abgesehen von deine Verständnisproblemen zu "einlesen" hat
dir c-hater bereits die Lösung genannt.

c-hater schrieb:
> Da muss man "escapen".

von da und dort (Gast)


Lesenswert?

Einer schrieb:
> Das was du willst gibt die Syntax nicht her.

Das ist nicht zutreffend.

von Schlangenbeinchen (Gast)


Lesenswert?

Attila C. schrieb:
> Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen
> innerhalb von Anfangs und End Gänsefüßchen einzulesen?

Wie oben genannt: mit escaping
1
char c[] = "abc\"123\"ABC";

von Dirk B. (dirkb2)


Lesenswert?

Das war gleich die allererste Antwort.

Aber das „einlesen“ hat viele verwirrt.

Beitrag #6709888 wurde von einem Moderator gelöscht.
Beitrag #6709892 wurde von einem Moderator gelöscht.
von Attila C. (attila)


Lesenswert?

Vielen Dank Leute!

von Sebastian W. (wangnick)


Lesenswert?

Attila C. schrieb:
> Vielen Dank Leute!

Super.

Aber wie gesagt, dieses escapen (also vor jedes doppelte 
Anführungszeichen einen backslash zu notieren) gilt nur für 
Stringliterale im C-Quellcode. Wenn du den Json-String zur Laufzeit über 
ein API einliest dann ist das nicht nötig!

LG, Sebastian

von Stefan F. (Gast)


Lesenswert?

Das erinnert mich an den Witz:

Immer wenn ich standen sage, ruft ihr bitte laut Nein, habt ihr das 
verstanden?

Nein!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.