sscanf hört bei Leerzeichen auf



  • Ich habe zwei Texte die durch ein | getrennt sind und trenne sind in einzelne Variablen mit sscanf, doch in der ersten Variable ist nur das erste Wort und in der zweiten sind irgentwelche Sonderzeichen. Wenn ich meine Texte ohne Leerzeichen und Zeilenumbrüche mache, funktionierts. Wie kann ich sscanf sagen das es nicht nach einem Leerzeichen aufhören soll?

    mfg.



  • sscanf(str,"%[^|]s",var1);



  • Cpt.Tanga schrieb:

    sscanf(str,"%[^|]s",var1);

    Okay, danke erstmal. Die erste Variable wird richtig eingelsen und hört auch an der richtigen Stelle auf, alles perfekt. Aber die Zweite nicht:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
     char var1[10];
     char var2[10];
     char var3[] = "Text Text|Text Text";
     cout<<"Variable 3: "<<var3<<endl;
     sscanf(var3,"%[^|]s|%[^|]s",var1,var2);
     cout<<"Variable 1: "<<var1<<endl;
     cout<<"Variable 2: "<<var2<<endl;
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    

    Ausgabe:

    Variable 3: Text Text|Text Text
    Variable 1: Text Text
    Variable 2:     x "
    Drücken Sie eine beliebige Taste . . .
    

    Was stimmt da nicht?



  • da du es offensichtlich sowiso mit c++ machst:

    string s="Test Text1|Test Text2";
    	string v1,v2;
    	string::iterator it=s.begin();
    	for (int i=s.find_first_of('|');i;--i) ++it;
    	*it++='\0';
    	v1=s;
    	v2=it;
    	cout<<v1<<endl<<v2;
    

    naja geht bestimmt auch eleganter aber was solls.

    falls du es dann doch lieber in c machen willst:

    char str[]="Test Text1|Test Text2";
    	char v1[16],v2[16];
    	char *p=str;
    
    	while (*p++!='|'&&p-str-1<strlen(str))
    		;
    	strncpy(v1,str,p-str-1);
    	v1[p-str-1]='\0';
    	strcpy(v2,p);
    
    	cout<<v1<<endl<<v2;
    

    ist wie gesagt noch stark verbesserungswuerdig fuer'n denkanstos sollte es aber reichen 😛



  • Cpt.Tanga schrieb:

    da du es offensichtlich sowiso mit c++ machst:

    string s="Test Text1|Test Text2";
    	string v1,v2;
    	string::iterator it=s.begin();
    	for (int i=s.find_first_of('|');i;--i) ++it;
    	*it++='\0';
    	v1=s;
    	v2=it;
    	cout<<v1<<endl<<v2;
    

    naja geht bestimmt auch eleganter aber was solls.

    falls du es dann doch lieber in c machen willst:

    char str[]="Test Text1|Test Text2";
    	char v1[16],v2[16];
    	char *p=str;
    
    	while (*p++!='|'&&p-str-1<strlen(str))
    		;
    	strncpy(v1,str,p-str-1);
    	v1[p-str-1]='\0';
    	strcpy(v2,p);
    
    	cout<<v1<<endl<<v2;
    

    ist wie gesagt noch stark verbesserungswuerdig fuer'n denkanstos sollte es aber reichen 😛

    Danke erstmal. Also der C Code klappt einwandfrei, aber der C++ nicht, ehrlichgesagt versteh ich auch nicht wie das klappen soll. Das "\0" gibt's doch eigentlich gar nicht mehr bei Cpp-Strings? Also dort erscheint dann einfach nur ein Leerzeichen anstelle des |. Und v2=it gibt nen Compilier Error, weil man kann ja nicht dem String einfach nen Iterator zuweisen oder?
    Also ich würde das Problem auch gerne mit sscanf lösen, wenn das überhaupt geht. Gibt's nicht sowas wie explode() bei PHP in C/C++?

    mfg.



  • void Explode(char *GesamtString, char *VordereTeil, char *HintereTeil)           /* z.B. Explode("Text1|Text2",v1,v2); v1 währe "Text1" und v2 währe "Text2"*/
    {
     char *p=GesamtString;                                                           /* p zeigt am Anfang auf die erste Stelle im String */
     do { *p++; }                                                                    /* Der "Cursor" (p) wird um eine Stelle nach rechts verschoben */
     while (*p != '|' &&                                                             /* Ist das Zeichen der Trennstrich "|"? */
            p-GesamtString-1<strlen(GesamtString));                                  /* Sind wir schon am Ende vom String? */
     strncpy(VordereTeil,GesamtString,p-GesamtString);                               /* Alles vor dem Trennstrich wird in VordereTeil geschrieben */
     VordereTeil[p-GesamtString]='\0';                                               /* Das Ende für VordereTeil wird gesetzt */
     strcpy(HintereTeil,p+1);                                                        /* Alles nach dem Trennstrich wird in HintereTeil gesetzt */
    }
    

    Ok ich habs jetzt ein bisschen umgeschrieben und ne Funktion drausgemacht. Eigentlich genau das was ich brauchte. Danke nochmal.

    mfg

    edit: da war noch ein fehler drinn, jetzt klappt's



  • Ich habe denn C++ Code mal überarbeitet, bei mir gehts so: (Ist für ein Konsolenprogramm)

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        string s="Test Text1|Test2";
        int pos;
        string v1,v2; 
        pos=s.find_first_of('|');
        if(pos == string::npos)           
               v1 = s;
        else
        {  
               v1 = s.substr(0,pos);
               v2 = s.substr(pos+1, s.size()-pos);
        }
        cout<<v1<<endl;
        cout << v2;
        cout << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten