string koppieren



  • Hallo, hab ein kleines testprogramm in einer mainfunktion erstellt was für mein hauptprogramm gedacht ist.
    Es geht um folgendes, ich will nen string in ein 2 dimensionales string array reinkoppieren und dann dieses 2 dim. array ausgeben, jedoch schaff ich das nicht..
    danke im voraus..

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char* text = "dsf,kt";
      int position;
      char string_array[0][position];
      int counter;
      for(counter = 0; counter <= 5; counter++)
        {
          string_array[0][counter] = text[counter];
        }
      printf("%s", string_array[0]);
    
      return 0;
    }
    


  • Da sind zu viele Fehler drin.. darf man erfahren was du damit erreichen möchtest? Dann kann man dir vielleicht einen Lösungsvorschlag machen.



  • ich wollte diesen *text string in ein 2 dimensionales array reinspeicher welches die stelle 0 hat.
    bin aber gerade darauf gekommen dass wenn ich hier statt *text, text[7] verwende es einwandfrei funktioniert. ich versteh nur nicht warum..
    beim vorherigen fall haengt es ihn immer beim character 't', also letzten character auf.
    grundsätzlich handelt es sich bei mir um einen text welche ich in wörter zerteilen muss und diese zerteilten wörter in ein 2 dim. array reinspeichern muss.



  • Du willst mir ernsthaft erzählen, dass der Code da oben überhaupt kompiliert - und dann noch nicht mal abstürzt? 😮
    Was denkst du denn wie viel Speicherplatz so für ein Array der Größe 0 reserviert wird? 😃

    Das mit dem Aufteilen der Strings gibt schon mal mehr Einsicht. Trotzdem, wozu genau soll das gut sein, erkläre ruhig deine ganze Situation. strtok() könnte sich z.B. anbieten, das hast du wahrscheinlich noch gar nicht auf dem Schirm.



  • :), ich kenn mich echt zu wenig aus, ich hab so wenig zeit um das fertig zu bringen.

    also es geht um einen text. dieser text soll nach gewissen trennzeichen, ' ' ',' '.' '\n' in ein 2 dim. string_array eingespeichert werden.
    zb. *text = "dsfsdf,.. dfg, dffdf fgri4d"
    string_array[0] = "dsfsdf"
    string_array[1] = "dfg"
    string_array[2] = "dffdf"
    string_array[3] = "fgri4d"

    dabei dürfen wir nur stdio.h und stdlib.h verwenden. also keine string.h
    strtok() darf ich also nicht verwenden, ausser ich implementier diese funktion selber (was doch zu hoher aufwand fürn anfänger wäre oder?)

    ich habs mir so überlegt; ich implementiere ne funktion wo am anfang ein integer array[] deklariert wird. dieses array[] speichert alle stellen dieser trennzeichen ab. wie zb: array[0] = 34, (34. stelle kommt das erste trennzeichen) array[1] = 37 (2. trennzeichen), array[2] = 38 (3. trennzeichen)

    also diese trennzeichen können auch aufeinander folgen.
    und jetzt komm ich zum punkt, also dieses array verwende ich dann in einem gewissen algorythmuss um diesen text folgendermassen in ein string_array[][] die einzelnen wörther einspeichern zu können..

    was haltest du von dem?



  • Das ist jetzt wirklich ein unschöner Lösungsansatz und ich hoffe, die andern hier zerpflügen ihn, dann haben wir alle was davon 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #define ARR_MAX
    int main()
    {
      char csvtext[100] = "blabli,blablub,blub,mi,ma,maeh";
    
      int position;
      char string_array[ARR_MAX][50];
      int counter;
      int i;
      for (position = 0, counter = 0, i = 0; counter < ARR_MAX && position < 50; counter++, position++, i++)
        {
          if (csvtext[i] == ','=
             {
                string_array[position][counter] = 0;
                continue;
             }
          string_array[position][counter] = csvtext[i];
        }
      for (i = 0; i < ARR_MAX; i++)
      {
         printf("%s\n", string_array[i]);
      }
    
      return 0;
    }
    


  • Die Zeile mit dem if (csvtext...) sollte am Schluss wohl eher eine geschlossene Klammer ')' als ein gleich-Zeichen haben



  • Meine Güte ist das ein Schwachsinn da oben... in der Schleife darf position logischerweise nur hochgezählt werden, nachdem string_array[position][counter] = 0; gesetzt wurde...

    string_array[position++][counter] = 0;
    

    und das position++ aus dem for() raus.



  • Hi, hab versucht deinen code zu kompillieren, es kompilliert schon jedoch ist die ausgabe von string_array[][] nicht richtig. Hat vielleicht jemand anders noch vorschlaege?



  • das is ja au gequirlter Mist, den ich da gepostet hab 🙂

    Sollte mehr n Denkanstoß sein, als ne detaillierte, kompilierbare Lösungsfunktion...
    In dem Zusammenhang möchte ich auch loswerden, dass Dein Compiler sehr phantasievoll ist... Wenn ich ARR_MAX ohne Wert define, abgesehen von den andren verfehlungen, sollte der Compiler schon böse meckern...

    #include <stdio.h>
    #include <stdlib.h>
    #define ARR_MAX 10
    int main()
    {
      char csvtext[100] = "blabli,blablub,blub,mi,ma,maeh";
    
      int position;
      char string_array[ARR_MAX][50] = { { 0 } };
      int counter;
      int i;
      for (position = 0, counter = 0, i = 0; counter < 50 && position < ARR_MAX; counter++, i++)
        {
          if (csvtext[i] == ',')
             {
                string_array[position][counter] = 0; 
                counter = -1;
                position++;
            //    continue;
             }
          else
            string_array[position][counter] = csvtext[i];
        }
      for (i = 0; i < ARR_MAX; i++)
      {
         if (string_array[i][0] == 0) break;
         printf("%s\n", string_array[i]);
      }
    return 0;
    }
    

    wird sich schon eher compilieren lassen. Vielleicht wird dabei das Prinzip klar und du kommst auf ne praktikable Lösung für Dich. Du durchsuchst den gegebenen String und schmeißt alles, was Du findest in einen String des String Arrays. Sobald Du auf ein Komma stößt, setzt Du statt des Kommas den Nullinger ins String Array, setzt die Zähler so, dass beim nächsten Schleifendurchlauf alles an der richtigen Stelle sitzt (counter in dem Falle -1, weil durch ++ auf 0 inkrementiert wird - da willst du ja landen) und schreibst wieder weg, bis du n Komma findest. Da ich das string-array mit '\0' initialisiert habe, machts erstmal nix, wenn du nach dem letzten schleifendurchlauf nicht zusätzlich noch ein '\0' anhängst - steht ja schon dort. Daran musst Du aber denken, wenn Du das String-Array nicht entsprechend initialisierst.



  • Hey, das war ne grosse hilfe, ich werd jetzt mein code darauf weiter bauen, danke forum, danke leute...



  • Wichtig ist halt vor allem, dass Du weißt, was da passiert ... Eine sowieso halb durchdachte Funktion von irgendwo von irgendwem einzubauen hilft Dir gefühlte 5 Minuten lang weiter.

    Wenn's noch Fragen gibt, immer raus damit. Gegebenenfalls auch in nem neuen Thread, damit die möglichen Lösungen gut "suchbar" bzw. findbar bleiben.



  • Also ich hab dein algorythmus komplett verstanden.. Es hilft mir gerade sehr viel weiter.
    Und jetzt kommen die naechsten Fragen..
    es geht darum, dass bei dir nur der fall für ein trennzeichen verwendet wurde.
    wie beim vorherigen bsp. also

    char csvtext[100] = "blabli,blablub,blub,mi,ma,maeh";
    

    in meinem programm muss ich mit mehreren trennzeichen welche hintereinander folgen rechnen so wie zb:

    char csvtext[100] = "blabli.  ,blablub,,,blub,mi.ma,maeh";
    

    Dafür hab ich mir was überlegt, und zwar folgendes: ich deklariere ganz am anfag ein int array[], welches alle stellenwerte der trennzeichen abspeichert.
    wenn wir das 2. beispiel oben betrachten sehen wir zb. dass die ersten 4 trennzeichen aufeinander folgen. Dafür eben dieses int array[].
    das heisst, bezüglich oben :

    array[0] = 7;
      array[1] = 8;
      array[2] = 9;
      array[3] = 10;
      array[4] = 18;
      array[5] = 19;
      array[6] = 20;
      array[7] = 25;
      array[8] = 28;
      array[9] = 30;
    

    und genau für solche Faelle hab ich dann eben deinen code erweitert und das dazugebaut:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 10
    
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blabli.,.--,blablub,blub,mi,ma,maeh";
      int array_position = 0;
      int array[array_position];
      int length = countLetters(text);
      int text_counter;
    
      for(text_counter = 0; text_counter < length; text_counter++)
      {
        if(text[text_counter] == ' ' || text[text_counter] == '\n' || text[text_counter] == '.' || text[text_counter] == ',')
        {
          array[array_position++] = text_counter + 1;
        }
      }
      int cut;
      int array_counter = 1;
      int position;
      char string_array[ARR_MAX][50] = { { 0 } };
      int counter;
      int i;
      for (position = 0, counter = 0, i = 0; counter < 50 && position < ARR_MAX; counter++, i++)
      {
        if ((text[i] == ',') || (text[i] == '.') || (text[i] == '\n') || (text[i] == ' '))
        {
          if((i == array[array_counter]) && ((array[array_counter] - 1) == (array[array_counter - 1])))
          {
            array_counter++;
            break;
            // hier ist die frage, wie kann ich von hier rausspringen so das unsere for schleife weiterläuft
            // und die beiden unteren else bedingungen dürfen nicht durchgeführt werden
          }
          else
          {
            string_array[position][counter] = 0;
            counter = -1;
            position++;
            //continue;
          }
        }
          else
            {
               string_array[position][counter] = text[i];
            }
    
        }
    
      for (i = 0; i < ARR_MAX; i++)
      {
         if (string_array[i][0] == 0) break;
         printf("%s\n", string_array[i]);
      }
    
    return 0;
    }
    

    jedoch funzt es noch nicht so genau, vielleicht irgendwelche vorschlaege?

    Ps: (ich muss 4 verschiedene trennzeichen berücksichtigen die sind '.' ',' ' ' und '\n'



  • so, hab den code nochmal umgeaendert, jedoch versteh ich nicht warum es ihn nach dem ersten string aufhaengt.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 10
    
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blabli..blablub,blub,mi ma,maeh";
      int array_position = 0;
      int array[array_position];
      int length = countLetters(text);
      int text_counter;
    
      for(text_counter = 0; text_counter < length; text_counter++)
      {
        if(text[text_counter] == ' ' || text[text_counter] == '\n' || text[text_counter] == '.' || text[text_counter] == ',')
        {
          array[array_position++] = text_counter + 1;
        }
      }
    
      printf("%c\n", text[7]);
      int array_counter = 1;
      int position;
      char string_array[ARR_MAX][50] = { { 0 } };
      int counter;
      int i;
      int break_up;
      for (position = 0, counter = 0, i = 0; counter < 50 && position < ARR_MAX; counter++, i++)
      {
        if(((i+1) == array[array_counter]) && ((array[array_counter] - 1) == (array[array_counter - 1])))
        {
          array_counter++;
          break_up = 0;
        }
    
        if(break_up != 0)
        {
        if ((text[i] == ',') || (text[i] == '.') || (text[i] == '\n') || (text[i] == ' '))
        {
          string_array[position][counter] = 0;
          counter = -1;
          position++;
            //continue;
        }
          else
          {
          string_array[position][counter] = text[i];
          }
        }
      }
    
      for (i = 0; i < ARR_MAX; i++)
      {
         if (string_array[i][0] == 0) break;
         printf("%s\n", string_array[i]);
      }
    
    return 0;
    }
    


  • andromeda_3050 schrieb:

    int array_position = 0;
      int array[array_position];
    

    Durch dieses Konstrukt hat das Feld array genau 0 (in Worten: Null) Elemente.
    Frage: Wieviel Werte kannst du darin speichern?



  • ich hab diese werte fürs array doch in dieser for schleife bestimmt:

    for(text_counter = 0; text_counter < length; text_counter++)
      {
        if(text[text_counter] == ' ' || text[text_counter] == '\n' || text[text_counter] == '.' || text[text_counter] == ',')
        {
          array[array_position++] = text_counter + 1;
        }
      }
    

    ich habe diese wert sogar im nachhinein ausgeben lassen und die wahren alle korrekt.



  • Du hast nicht verstanden:
    Du hast das array zwar definiert, aber nur für genau 0 Elemente, d.h. wenn du mehr als 0 Elemente in das array schreibst, erhälst du undefiniertes Verhalten, d.h. ziemlich sicher Müll.



  • achso, ist mir jetzt klar was du meintest, das heisst doch dass ich für dieses array im vornhinein schon ne fixe grösse brauch. also zb:

    int number = 8;
      int array[number];
    


  • Und wenn du portabler mit deinem Code werden willst, d.h. C89 statt C99, macht man das üblicherweise so:

    #define MEINE_ARRAY_GROESSE 8
    
    int mein_array[MEINE_ARRAY_GROESSE];
    


  • sorry nochmal, ich habs jetzt wieder mit null geaendert und es funzt
    es liegt nicht darin:

    int number = 8;
      int array[number];
    

    ich hab doch wie gesagt diese werte in der for schleife initialisiert um diese wert nachher in der trennzeichenschleife verwenden zu können, diese werte sind doch dann fixiert, sorry aber der fehler liegt eben nicht darin..



  • so jetzt nochmal, meine frage ist in dem code drinnen, es handelt sich um die letzte for loop, um eine if bedingung mit der ich nicht zu recht komm. bitte um einen denkanstoss.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 10
    
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blabli...   blablub,blub,mi ma,maeh";
      int array_position = 0;
      int array[array_position];
      int length = countLetters(text);
      int text_counter;
    
      for(text_counter = 0; text_counter < length; text_counter++)
      {
        if(text[text_counter] == ' ' || text[text_counter] == '\n' || text[text_counter] == '.' || text[text_counter] == ',')
        {
          array[array_position++] = text_counter + 1;
        }
      }
    
      int array_counter = 1;
      int position;
      char string_array[ARR_MAX][50] = { { 0 } };
      int counter;
      int i;
      int break_up = 1;
      for (position = 0, counter = 0, i = 0; counter < 50 && position < ARR_MAX; counter++, i++)
      {
    
        if ((text[i] == ',') || (text[i] == '.') || (text[i] == '\n') || (text[i] == ' '))
        {
    
        if(((i+1) == array[array_counter]) && ((array[array_counter] - 1) == (array[array_counter - 1])))
        {
          array_counter++;  //wie kann ich hier an dieser stelle aus der for schleife abspringen um das sie weiterzaehlen kann??
          //break;
        }
    
          string_array[position][counter] = 0;
          counter = -1;
          position++;
            //continue;
        }
          else
          {
          string_array[position][counter] = text[i];
          }
        }
      }
    
      for (i = 0; i < ARR_MAX; i++)
      {
         if (string_array[i][0] == 0) break;
         printf("%s\n", string_array[i]);
      }
    
    return 0;
    }
    

Anmelden zum Antworten