string koppieren



  • 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;
    }
    


  • andromeda_3050 schrieb:

    sorry nochmal, ich habs jetzt wieder mit null geaendert und es funzt

    Nein das funzt nicht. Mach mal eine Pause.



  • dann spinnt mein compiler weil ich kenn mich gar nicht mehr aus, ich hab dieses array zum test ausgeben lassen, kurz bevor main endet und es gibt mir alle stellenwerte aus. so wie das hier:

    int counter2;
      for(counter2 = 0; array[counter2]; counter2++)
        {
          printf("%d", array[counter2]);
        }
    

    wenn das zutrifft was du meinst, dürfte er mir das ja gar nicht ausgeben..
    oder ich versteh was falsch



  • Ja, du verstehst was falsch.
    Ich habe recht und du nicht. Der Compiler hat immer recht, auch mit seinen Warnungen:

    http://www.ideone.com/vGJbG



  • diese warnungen hat mein compiler eben nicht ausgegeben. das ist echt mies. dann will ich dazu noch was erwaehnen was vielleicht ziemlich komisch klingt.
    ich hab probiert dieses int array[] mit array_position zu deklarieren, also genau sogar mit der grösse die es braucht, wie vorher beschrieben mit zb:

    #define size 10
    int array[size]
    

    diesmal wurden die stellenwerte gar nicht mal eingespeichert und das programm hat mir diese stellewerte nicht mal ausgegeben..
    weiss nicht woran das liegt



  • sorry, ich hab mich doch getäuscht, das hab ich jetzt ausgebessert, also eine fixe grösse angelegt. aber jetzt will ich zum punkt kommen, in der letzten for loop hab ich noch ne if abfrage eingebaut (allerdings für die abfrage der aufeinanderfolgenden trennzeichen). weiss nicht wie ich das besser regeln könnte, hab die frage direkt in den code reingeschrieben.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 8
    
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blablic,...blablub,blub,mi ma,maeh";
      int array_position = 8;
      int array[array_position];
      int length = countLetters(text);
      int text_counter;
      for(text_counter = 0, array_position = 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;
        }
        else
        array[array_position] = 0;
      }
    
      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] == ' '))
          {
          break_up = 1;
          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 weiterzaehlt??
            break_up = 0;  //habs damit versucht jedoch funktioniert das nicht
          }
    
          if((break_up == 1) && ((text[i] == ',') || (text[i] == '.') || (text[i] == '\n') || (text[i] == ' ')))
          {
          string_array[position][counter] = 0;
          counter = -1;
          position++;
          }
          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;
    }
    


  • habe den code wieder umgaendert und meiner meinung nach müsste dieser jetzt so funktionieren, tut er aber nicht, hat keiner ne bessere idee?

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 8
    
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blablic,. blablsub,blub,mi ma,maeh";
      int array_position = 8;
      int array[array_position];
      int length = countLetters(text);
      int text_counter;
      for(text_counter = 0, array_position = 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;
        }
        else
        array[array_position] = 0;
      }
    
      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 weiterzaehlt??
            continue;
          }
          else
          {
          string_array[position][counter] = 0;
          counter = -1;
          position++;
          }
          }
          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;
    }
    


  • Aus Schleifen springen: break;
    In nächsten Schleifendurchgang springen: continue;

    Ich wollte deinen Code eigentlich ja noch durchkommentieren, das fällt mir aber gerade nicht so leicht.
    -> Beim Stringlänge zählen ist nur ein Zähler nötig.
    -> main ist nicht korrekt nach C definiert
    -> Kommentiere deinen Code bitte noch etwas... oder sag bitte was genau wo schief geht



  • also was das programm genau machen soll, ist doch hoffentlich klar oder? wenn nicht, dann kurze beschreibung, es soll einen text in strings trennen, und das nach gewissen trennzeichen, diese sind . , (leerzeichen) und '\n'
    beim obigen bsp. sollte es zb so aussehen.

    char *text = "blablic,,.blablsub,blub,mi ma,maeh";
    string_array[0] = "blablic"
    string_array[[1] = "blablsub"
    string_array[[2] = "blub"
    string_array[[3] = "mi"
    string_array[[4] = "ma"
    string_array[[5] = "maeh"
    

    wenn ich das dann aber ausgeben lassen will dann haengt er sich nach dem wort "blablic" auf, und der grund sind diesmal 3 aufeinander folgende trennzeichen.

    für aufeinander folgende trennzeichen hab ich diese if schleife noch reingebaut.

    if((array[array_counter] == (i+1)) && ((array[array_counter - 1]) == (array[array_counter] - 1)))
          {
            array_counter++;
            continue;  of the for loop
          }
    

    in dieser schleife sollte er die restliche for schleife abbrechen und, bei for oben wieder weiter zaehlen, jedoch macht er das nicht.

    include <stdio.h>
    #include <stdlib.h>
    
    #define ARR_MAX 8
    
    //zaehle die buchstaben des eingegebenen textes
    int countLetters(char* string)
    {
      int counter;
      int letters = 0 ;
    
      for (counter = 0; string[counter] != '\0'; counter++)
      {
        letters++;
      }
      return letters;
    }
    
    int main()
    {
      char *text = "blablic,,.blablsub,blub,mi ma,maeh";
      int array_position = 8;
      int array[array_position]; //dieses array bestimmt die stellenwerte der trennzeichen
      int length = countLetters(text);
      int text_counter;
      for(text_counter = 0, array_position = 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; //genau hier werden die trennzeichen festgestellt
        }
        else
        array[array_position] = 0;
      }
    
      int array_counter;
      int position;
      char string_array[ARR_MAX][50] = { { 0 } };
      int counter;
      int i;
      for ( position = 0, counter = 0, i = 0, array_counter = 1; counter < 50 && position < ARR_MAX; counter++, i++)
      {
        if ((text[i] == ',') || (text[i] == '.') || (text[i] == '\n') || (text[i] == ' '))
        {
          if((array[array_counter] == (i+1)) && ((array[array_counter - 1]) == (array[array_counter] - 1)))
          {
            array_counter++;
            continue;  //hier sollt er abspringen wegen aufeinander folgende trenzeichen und bei for weiter zaehlen
          else
          {
            string_array[position][counter] = 0; //sonst naechstes string_array
            counter = -1;
            position++;
          }
        }
        else
        {
          string_array[position][counter] = text[i];
        }
      }
      int counter2;
      for(counter2 = 0; array[counter2]; counter2++)
      {
        printf("%d\n", array[counter2]);
      }
    
      for (i = 0; i < ARR_MAX; i++)
      {
         if (string_array[i][0] == 0) break;
         printf("%s\n", string_array[i]);
      }
    return 0;
    }
    


  • zwischen zeile 48 und 49 fehlt ne geschlossene geschweifte klammer }


Anmelden zum Antworten