In String nach Zeichen suchen



  • In der inneren Schleife achtest du nicht darauf das das Ende des strings erreicht sein könnte, was zu einem Problem führt wenn kein weiteres " in dem rest des strings ist. Also in deinem fall meistens wenn du beim zweiten auftreten von " in die innere Schleife eintrittst, was du ja wohl auch garnicht willst, da dein Ergebins dann überschrieben wird. Hier eine Lösung die im Falle wenn du zwei " in dem string hast funktioniert.

    char * Command = "blablablabla \"10\"";
      char Result[100];
      int Count = 0;
    
      for(unsigned int s1 = 0;s1 < strlen(Command);++s1){
        if(Command[s1] == '\"'){
          for(int s2 = s1 +1;Command[s2] != '\"';++s2){
            Result[Count] = Command[s2];
            ++Count;
          }
          Result[Count]='\0';
    	  break;
        }
      }
    

    Gruß
    Entyl Sa



  • thx,
    das war's!



  • Ich habe die Funktion etwas umgeschrieben, so dass aus einem String wie "110+20+20" (Ja, es geht um RGB Werte) die 3 Werte ausgelesen werden. Leider klappt es wieder nicht und ich habe schon wieder keine Ahnung woran das liegt.

    char TheRValue[10];
    char TheGValue[10];
    char TheBValue[10]
    int CC_Value = 0;
    int Count = 0;
    
    for(unsigned int s1 = 0;s1 < strlen(Command);++s1){
      if(Command[s1] == '\"'){
        for(int s2 = s1 +1;Command[s2] != '\"';++s2){
          if(CC_Value == 3)
            break;
          if(Command[s2] == '+'){
            CC_Value++;
            Count = 0;
          }
          else{
            switch(CC_Value){
              case 0: TheRValue[Count] = Command[s2];
                      TheRValue[Count+1] = '\0';
                      break;
              case 1: TheGValue[Count] = Command[s2];
                      TheGValue[Count+1] = '\0';
                      break;
              case 2: TheBValue[Count] = Command[s2];
                      TheBValue[Count+1] = '\0';
                      break;
              }
            Count++;
          }
        }
      }
    }
    

    Irgendwei scheint CC_Value nie den Wert 3 zu erreichen, so dass die Schleife immer weiter läuft und irgendwann eine Exeption auftritt.(Keine Endlosschleife!)
    Ich kann mir das aber nicht so ganz erklären, da ich ja im Falle des zweiten " sofort die Schleife verlasse.

    Der String steht natürlich in Command(char Command[100]) und sollte auch zero-terminated sein.



  • Du erhöhst CC_Value wenn du ein "+" findest. Hast aber ja nur zwei "+" Zeichen in deinem String, wie soll er also auf 3 kommen?



  • Entyl_Sa schrieb:

    wie soll er also auf 3 kommen?

    Gar nicht!
    Aber es wird ja abgebrochen sobald das zweite Anführungszeichen erreicht wird. Oder verpeil ich da gerade was?



  • Ja 🙂

    char * Command = "blabla \"120+10+12\"";
    char TheRValue[10];
    char TheGValue[10];
    char TheBValue[10];
    int CC_Value = 0;
    int Count = 0;
    
    for(unsigned int s1 = 0;s1 < strlen(Command);++s1){
      if(Command[s1] == '\"'){
        for(int s2 = s1 +1;Command[s2] != '\"';++s2){
          if(CC_Value == 3)// Das ist der Grund für mein letztes Post
            break;
          if(Command[s2] == '+'){
            CC_Value++;
            Count = 0;
          }
          else{
            switch(CC_Value){
              case 0: TheRValue[Count] = Command[s2];
                      TheRValue[Count+1] = '\0';
                      break;
              case 1: TheGValue[Count] = Command[s2];
                      TheGValue[Count+1] = '\0';
                      break;
              case 2: TheBValue[Count] = Command[s2];
                      TheBValue[Count+1] = '\0';
                      break;
              }
            Count++;
          }
        }
    	break; //Das scheinst du wieder rausgenommen zu haben
      }
    }
    

    Irgendwie werde ich den Eindruck nicht los das es dafür eine elegantere Lösung geben müßte, naja, ich sag bescheid wenn ich das konkretisieren kann.

    Gruß
    Entyl Sa



  • Ups ja das [B]break[/B fehlte, aber das macht die Sache nicht viel besser. Jetzt Spuckt er zwar drei Werte aus, der dritte ist jedoch immer falsch.

    Aus "100+101+102" wird
    100
    101
    102100

    Anscheinend hängt er an den dritten Wert noch den ersten dran. Warum er das macht habe ich jedoch noch nicht herausgefunden.



  • Ups ja das break fehlte, aber das macht die Sache nicht viel besser. Jetzt Spuckt er zwar drei Werte aus, der dritte ist jedoch immer falsch.

    Aus "100+101+102" wird
    100
    101
    102100

    Anscheinend hängt er an den dritten Wert noch den ersten dran. Warum er das macht habe ich jedoch noch nicht herausgefunden.

    [EDIT]Ich hab's! Es lag daran wie ich den Code aus dem Forum in mein Projekt eingefügt habe. Jetzt geht es - sei es nun elegant oder nicht/[EDIT]



  • Ich habe mir dann doch nochmal überlegt wie ich das machen würde, hat mich einfach nicht los gelassen. Mein Ergebnis ist folgendes:

    char* Command ="blabla \"120+10+14\"";
    	char * t1;
    	char * t2;
    	int len;
    	int TheRGBValue[3];
    
    	//den Bereich zwischen den " heraussuchen und in ein neues char array kopieren
    	t1 = strchr(Command, '\"');
    	len = strchr(++t1,'\"')-t1;
    	t2 = new char[len+1];
    	strncpy(t2,t1,len);
    	t2[len]='\0';
    
    	//unterteilen und speichern
    	t1 = strtok(t2, "+");
    	for(int i=0; t1!=0; i++){
    		TheRGBValue[i]=atoi(t1);
    		t1 = strtok(NULL,"+");
    	}
    	delete[] t2;
    	//ausgeben zum überprüfen
    	for(i=0;i<3;i++)cout<<TheRGBValue[i]<<endl;
    

    Sorry für meinen new und delete einsatz hier im Ansi C.
    Wobei ich bei Command davon ausgegangen bin das ich es nicht modifizieren darf, sonst könnte ich mir das erstellen eines neuen Arrays sparen. Und die RGB Werte habe ich kurzerhand in einem Integer Array gespeichert. Vielleicht gefällt es dir ja auch.

    Gruß
    Entyl Sa



  • Jup, der Array ist besser als drei Strings. Also nochmal vielen Dank...


Anmelden zum Antworten