string koppieren



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



  • stimmt, funzt aber trotzdem nicht.. dein code hat mir echt viel weiter geholfen, vielleicht kannst du noch was dazu sagen..
    also das ist die richtige version..

    #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; //here it gets the position for separator character for the actual array[]
        }
        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))) //if a separator sign follows another
          {
            array_counter++;
            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]); //why does it print only the first one?
      }
    return 0;
    }
    


  • Ich finde die Lösung mit dem int-array ehrlich gesagt unnötig.
    Nimm meine vorherige Version her, bau in den if-Zweig in der for-Schleife minimal was um... ich hebs mal hervor.

    #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 c = 0;
      int i;
      for (position = 0, counter = 0, i = 0; counter < 50 && position < ARR_MAX; counter++, i++)
        {
     /* */c = csvtext[i];
     /* */if (c == '\n' || c == ' ' || c == '.' || c == ',')
             {
                string_array[position][counter] = 0;
                counter = -1;
     /* */      for(; c == ',' || c == '.' || c == ' ' || c == '\n'; c = csvtext[++i]);
                position++;
     /* */      i--;
            //    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;
    }
    

    Wenn Du einmal feststellst: Huch, da war ja eines der bösen Zeichen!
    Damit ist ja der Teilstring erkannt, darf also terminiert werden, counter gesetzt wie vorher auch.
    Dann läuft die nächste for-Zeile an:
    solange das aktuelle Zeichen pöse ist, wird einfach durchgezählt. Wenn das Zeichen nicht mehr pöse ist, stehst Du aber ja schon ein Zeichen zu weit mit dem zähler i. Deshalb wird der danach nochmal um 1 verringert (zu diesem zeitpunkt ist csvtext[i] dann eines der pösen Zeichen) und durch Deine If-else-Verzweigung landest Du automatisch wieder bei der Hauptschleife.



  • Gerade wollte ich das gleich schreiben. 😃
    Zu kompliziert gedacht
    Sollte zu verstehen sein: http://codepad.org/vR6Gyyry



  • erstmal danke für diese gute Lösungen an euch, hab jetzt das letzt von DirkB genommen, nur eines war mir noch nicht ganz klar, und zwar was bei dieser for loop gemacht wird:

    // restliche Zeilen 'löschen'
      for (; array_zeile < ARR_MAX; array_zeile++)
      { string_array[array_zeile][array_position] = '\0';   //
        array_position = 0;
      }
    

    ich versteh dass es hier um diese aufeinanderfolgenden trennzeichen geht aber wie das genau erfolt wurde mir nicht ganz klar.
    von wo wird hier angefangen zum zaehlen und was für zeilen werden da genau gelöscht? danke im voraus



  • Da geht es nicht mehr um aufeinanderfolgenden Trennzeichen.

    Das string_array hat ARR_MAX (10) Zeilen. Wenn du aber nur 6 Strings hast, wird so in die letzten 4 Zeilen ein Leerstring geschrieben. (Das string_array ist ja vorher nicht initialisiert worden.)

    Nebenbei wird noch die letzte Zeile mit Text terminiert, wenn danach kein Trennzeichen kam.

    Aufeinanderfolgende Trennzeichen werden durch if (array_position != 0) erkannt.

    Wenn der Spaltenzähler (array_position) noch auf 0 steht, hast du noch keine Zeichen in die Zeile kopiert. Das bedeutet, dass du bisher nur Trennzeichen hattest. Dann brauchst du auch keine neue Zeile anfangen.



  • { // Kein Trennzeichen
          string_array[array_zeile][array_position++] = text[text_position]; // Zeichen kopieren
        }
    

    Da fehlt noch die Überprüfung, ob array_position schon an die Grenze (hier 50) stößt.


Anmelden zum Antworten