[c] Array auslesen

Sinc

Mitglied
Hallo,

ich schreibe ein Programm in C bei dem ich aus einer XML-Datei bestimmte Daten auslesen möchte.
Nun bin ich an dem Punkt, an dem ich die XML-Datei eingelesen und zeilenweise in ein Array gepackt habe.

Wie kann ich dieses Array nach bestimmten Daten durchsuchen?

Mein bisheriger Versuch:
Code:
while(i<=Zeilennummer)
{
	if (Zeilentext[i]=="<beispiel>")
	{
		flag=1;
		i+=1;
	}
	else
	{
		i+=1;
	}

Leider funktioniert diese Version nicht so wie ich will, bzw. eigentlich funktioniert sie überhaupt nicht.

Wäre super, wenn ihr mir auf die Sprünge helfen oder Tipps für andere Lösungsmöglichkeiten anbieten könntet.
Danke im Voraus.
 
Zuletzt bearbeitet:
Hi.

XML zu Fuß mit C zu parsen kann ziemlich haarig werden. Da würde sich eine Bibliothek (xerces-c etc.) anbieten.

Dein Problem liegt hier aber darin, das man Strings in C nicht mit dem == Operator vergleichen kann da C Strings nur Zeiger sind. Such einfach mal im Forum nach strcmp bzw. strncmp usw.

Gruß
 
Ok. Wenn also deine Frage beantwortet ist dann drück doch noch schnell auf den "Erledigt" Button um das Thema als erledigt zu markieren.

Gruß
 
Schade, zu früh gefreut.
Mit strcmp geht er zwar manchmal in die Verzweigung, nur nicht bei <beispiel>.

Code:
while(i<=Zeilennummer)
{
	if (strcmp(Zeilentext[i], "<beispiel>") == 0)
	{
		flag=1;
		printf("Flag: %d\n",flag);
		printf("I: %d\n",i);
		i+=1;
	}
	else
	{
		printf("%s",Zeilentext[i]);
		flag=0;
		printf("Flag: %d\n",flag);
		printf("I: %d\n",i);
		i+=1;
	}
}

Für Hilfe wär ich dankbar.
 
Wie ist denn die Ausgabe von einem Beispiellauf des Programms?

Sind evtl. Leerzeichen mit in den Strings? Hast du dir mal genau mit einem Debugger die Variablen angschaut?

Gruß
 
Inhalt der Beispieldatei:
test
<beispiel>
test
<test>
<beispiel>
</beispiel>
test


Ausgabe des Programms:
test
Flag: 0
I: 0
<beispiel>
Flag: 0
I: 1
test
Flag: 0
I: 2
<test>
Flag: 0
I: 3
<beispiel>
Flag: 0
I: 4
</beispiel>
Flag: 0
I: 5
testFlag: 0
I: 6
Flag: 0
I: 7



Inhalt der Beispieldatei2:
test
<beispiel>
test
<test>
<beispiel>
</beispiel>
test
<beispiel>


Ausgabe des Programms:
test
Flag: 0
I: 0
<beispiel>
Flag: 0
I: 1
test
Flag: 0
I: 2
<test>
Flag: 0
I: 3
<beispiel>
Flag: 0
I: 4
</beispiel>
Flag: 0
I: 5
test
Flag: 0
I: 6
Flag: 1
I: 7
Flag: 0
I: 8


Er erkennt den String nur, wenn dieser am Ende der Datei steht.

Ich speicher das Array mit fgets. Wird dort noch der Zeilenumbruch mit zugefügt?

edit: Der jeweilig letzte Wert(rot makiert) der Ausgabedateien kann ignoriert werden.
N Denkfehler von mir... doofe Arrays!
Problem ansich bleibt trotzdem.
 
Zuletzt bearbeitet:
fgets(Zeilentext[Zeilennummer],MAX,xml); liest wohl nicht bis zum Zeilenumbruch
sondern nimmt den gleich mit.
Nun hab ich hier im Forum und unter Google nach passenden Lösungen gesucht,
find aber keine für C.

Wie entferne ich denn bei Strings in C Zeilenumbrüche?
 
Zuletzt bearbeitet:
Das könntest du zB so lösen

Wie ich das gesehen habe, denke ich, dass du die Einträge in ein zweidimensionales Array speicherst. Nun hättest du die Möglichkeit, das letzte Zeichen jedes Eintrags auf '\n' zu überprüfen und zB durch '\0', was ja allgemein als Ende eines Strings gilt, ersetzen.

mal ein Bsp:
C:
//i ist ein Schleifencounter mit dem du jedes Element im Array durchzählst
if (array[i][strlen(array[i]) - 1] == '\n')
    array[i][strlen(array[i] - 1] = '\0';

Eine weitere Möglichkeit währe es, die Zeilen nit mit fgets sondern mit fgetc einzulesen. Dies machst du dann bis du ein '\n' findest und schreibst stattdessen dann ein '\0' ins Array. Bei dieser Methode musst du jedoch auf das Fileende aufpassen, da beim letzten Eintrag normalerweise kein '\n' steht.

lg Masda

//edit
PS: mit [ c]code[ /c] kannst du zB Codehighliting für die Programmiersprache C bewirken, was den Code eindeutig leserlicher gestaltet ;)
 
So in etwa hab ich mir das vorgestellt, danke.

Wenn ich jetzt nicht total daneben liege, meinst du das so:
C:
if Zeilentext[Zeilennummer][strlen(Zeilentext[Zeilennummer]) - 1] == '\n')
Zeilentext[Zeilennummer][strlen(Zeilentext[Zeilennummer] - 1] = '\0';

Leider zeigt er mir dann einen syntax error bei Zeilentext an.
 
Zurück