Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Reihe in Struktur

  1. #1
    Registrierter Benutzer Avatar von Nicolas
    Registriert seit
    16.06.2000
    Ort
    BW
    Beiträge
    65

    Post Reihe in Struktur

    Hallo!

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

    Code:
    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:
    Code:
    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

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du hast leider nicht angeben, wie reihe deklariert ist.

    Aber hier ein Beispiel das sowas in der Art macht:
    Code:
    #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,
    _

  3. #3
    Registrierter Benutzer Avatar von Nicolas
    Registriert seit
    16.06.2000
    Ort
    BW
    Beiträge
    65
    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
    Geändert von Nicolas (19-06-2002 um 11:43 Uhr)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wenn du hinter dem letzen Wort kein Komma hast, terminiert die inner Schleife beim letztrn wort nicht.

    Vielleicht geht es anders herum besser:

    Code:
    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,
    _

  5. #5
    Registrierter Benutzer Avatar von Nicolas
    Registriert seit
    16.06.2000
    Ort
    BW
    Beiträge
    65

    Wink

    Ich hab jetzt auch ne Lösung gefunden, die sogar kürzer ist, als deine.

    Code:
    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

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Nicolas
    Ich hab jetzt auch ne Lösung gefunden, die sogar kürzer ist, als deine.


    meine fand ich schöner

    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.
    Code:
    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

    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,
    _

  7. #7
    Registrierter Benutzer Avatar von Nicolas
    Registriert seit
    16.06.2000
    Ort
    BW
    Beiträge
    65
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •