In String nach Zeichen suchen



  • Ich hab irgendwie schon ein Knoten im Hirn und hab keinen Plan was ich falsch mache. Ich will aus einem String, der einen beliebigen Text enthält, aber ganz sicher irgendwo so etwas hier hat: "10", das Stück zwischen den Anührungszeichen herausschnibbeln. Lange Rede, kurzer String:
    aus "blablablabla "10"" mach "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[strlen(Result)+1] = '\0';
    

    Was mach ich da falsch?

    [EDIT] Mist, würde wohl besser nach Ansi C passen 😉 [/EDIT]



  • Result[strlen(Result)+1] = '\0';
    

    strlen arbeitet mir nullterminierten strings, nur dein char Array ist ja nicht nullterminiert, also kann die Funktion kein richtiges Ergebnis liefern.

    probiers mal so:

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

    Gruß
    Entyl Sa



  • Das klingt einleuchtend, aber leider funktioniert es immer noch nicht. 😮



  • wie währe es mit

    Result[Count]='\0';
    


  • Bringt auch nix. Ich hab so das dumpfe Gefühl das Problem ist weniger die terminierende Null. Aber was ist es dann...



  • [EDIT] Mist, würde wohl besser nach Ansi C passen 😉 [/EDIT]

    Wie du willst.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • 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