PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Reihe in Struktur



Nicolas
18-06-2002, 20:41
Hallo!

Ich versuche schon die ganze Zeit eine Reihe wie: reihe="text1,text2,text3" in folgende Struktur einzuspeisen:



typedef struct text
{
char name[255];
char wert;
}TEXT;

TEXT texte[5];


Das soll danach dann so aussehen:
texte[0].name="text1"
texte[1].name="text2"
texte[2].name="text3"
...

Ich hab mal was geschrieben:


int i=0, i_old=0, j=0;

while (reihe[i+i_old] != '\0')
{
i=0;
while (reihe[i+i_old] != ',')
{
texte[j].name[i]=reihe[i+i_old];
i++;
}
i_old=i+1; // hab auch schon i_old=i+i_old+1 probiert;
j++;
}


Bei zwei Elementen geht es noch gut, aber ab drei Elementen kommt nur noch ein Speicherzugriffsfehler. (Kann man mit C überhaupt Programme schreiben, die auf den Speicher richtig zugreifen?) Das was im Kommentar steht, geht auch nicht, denn da kommt gleich der Speicherzugriffsfehler.

Wer kann mir helfen?
Für eine Weiterhilfe wäre ich sehr dankbar.

Nicolas

anda_skoa
18-06-2002, 21:58
Du hast leider nicht angeben, wie reihe deklariert ist.

Aber hier ein Beispiel das sowas in der Art macht:


#include <stdlib.h>
#include <stdio.h>

typedef struct text {
char name[255];
char wert;
} TEXT;

int main()
{
char* names[] = {"test1","test2", "test3"};
TEXT texte[10];
uint i;
for (i = 0; i < 10; ++i)
{
strcpy(texte[i].name, names[i%3]);
}
for(i = 0; i < 10; ++i)
{
printf("text %d: %s\n", (i+1), texte[i].name);
}
}


Wenn du in C Zeichenketen kopieren willst, mußt du strcpy oder strncpy verwenden.
Wenn du sie vergleichen willst, strcmp.

Wenn du viel mit Strings arbeiten mußt, solltest du über C++ nachdenken :)

Ciao,
_

Nicolas
19-06-2002, 11:40
Ich glaub ich hab mich nicht so gut ausgedrückt:
Ich will einen Text:
char reihe[255]="text1,text2,text3,..." (nur mit Kommata abgetrennt in einem String)
in die oben angegebene Struktur einspeisen, dass das ganze dann so aussieht, wie ich es beschrieben habe.

Nicolas

anda_skoa
19-06-2002, 14:25
Wenn du hinter dem letzen Wort kein Komma hast, terminiert die inner Schleife beim letztrn wort nicht.

Vielleicht geht es anders herum besser:



int textNr = 0;
int textIndex = 0;
for (int i = 0; i < 255; ++i) // 255 == Länge von Reihe
{
if (reihe[i] == ',')
{
texte[textNr].name[textIndex] = '\0';
textNr++;
textIndex = 0;
if (textNr >= 5) // Antzahl der TEXT structs
break;
}
else
{
texte[textNr].name[textIndex] = reihe[i];
textIndex++;
}
}


Ciao,
_

Nicolas
19-06-2002, 15:42
Ich hab jetzt auch ne Lösung gefunden, die sogar kürzer ist, als deine.



char *ptr;
int i=0,i_old=0,j=0;

for(i=0;deps[i]!='\0';i++)
{
if (reihe[i]==',')
{
ptr=&reihe[i_old];
strncat(texte[j].name,ptr,i-i_old);
i_old=++i;
j++;
}
}
strncat(texte[j].name,ptr,i-i_old);


Nur muss ich bei der Struktur texte.name kleiner machen, sonst erscheinen plötzlich sonderbare Zeichen, dann hab ich nämlich sowas wie "ÿÿÿÿlïÿ¿èj@ðe@text2". Ist es eigentlich ratsam bei Strings die Größe so klein wie möglich zu halten, oder gibt es eine Möglichkeit, die Stringgröße dynamisch zu machen?
Wäre es vielleicht doch besser, dass ich, wenn ich mit so vielen Strings rumhantieren muss, doch C++ benutze? Welche Vorteile hab ich da in Bezug auf Stringbearbeitung?

Nicolas

anda_skoa
19-06-2002, 16:49
Original geschrieben von Nicolas
Ich hab jetzt auch ne Lösung gefunden, die sogar kürzer ist, als deine.

:)
meine fand ich schöner :p

Nur muss ich bei der Struktur texte.name kleiner machen, sonst erscheinen plötzlich sonderbare Zeichen, dann hab ich nämlich sowas wie "ÿÿÿÿlïÿ¿èj@ðe@text2".


Du mußt die name Variable mit '\0' terminieren.
also am besten am Anfan name[0] = '\0';



Ist es eigentlich ratsam bei Strings die Größe so klein wie möglich zu halten, oder gibt es eine Möglichkeit, die Stringgröße dynamisch zu machen?


Ja, des geht schon.


char* name;

// Größe ermitteln, hier einfach eine Konstante
size_t size = 255;

name = malloc(size);


Aber dann nicht vergessen, am Ende den Speicher wieder mit free(name) freigeben.



Wäre es vielleicht doch besser, dass ich, wenn ich mit so vielen Strings rumhantieren muss, doch C++ benutze? Welche Vorteile hab ich da in Bezug auf Stringbearbeitung?


Es gibt in C++ eine string Klasse.
std::string

Die ist zB immer groß genug, hat Funktionen um substrings zu bilden, etc.

Noch cooler ist natürlich die QString Klasse von Qt :p

Also wenn du viel mit Strings tun musst, würde ich auf jeden Fall eher C++ statt C nehmen.

Da spart man sich viel Ärger.

Ciao,
_

Nicolas
19-06-2002, 18:04
Ich glaube ich werde das ganze Programm doch mit C++ schreiben, wenn das dann besser geht. Mit den Strings hab ich hier schon meine liebe Not.

Aber ich denke nicht, dass es sich rentiert, nur wegen der Strings Qt für ein Konsolenprogramm zu benutzen. Da ich aber viel in KDE programmiere, vermisse ich das schon ein bisschen.

Danke für deine Antworten.

Nicolas