1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Stringvergleich in C

Dieses Thema im Forum "OS X-Developer" wurde erstellt von MarCus88, 04.12.09.

  1. MarCus88

    MarCus88 Alkmene

    Dabei seit:
    29.10.09
    Beiträge:
    31
    Hallo zusammen,

    ich hab ein kleines Problem was einen Vergleich zweier Strings in C angeht. Unsere Aufgabe ist es die Stringcompare-Funktion selbst zu schreiben, als Teilfunktion eines größeren Programmes.

    Mein bisheriger Lösungsansatz schaut so aus:

    Code:
    int pos(void)
    {
    	char s[100], q[100], *ps,*pq;
    	ps=&s[0];
    	pq=&q[0];
    	int position=0;
    	
    	printf("Bitte einen String eingeben: ");
    	fpurge(stdin);
    	while (((*ps)=getchar())!='\n') 
    	{
    		ps++;
    	}
    	*ps='\0';
    	ps=&s[0];
    	
    	printf("Bitte einen weiteren String eingeben: ");
    	fpurge(stdin);
    	while (((*pq)=getchar())!='\n') 
    	{
    		pq++;
    	}
    	*pq='\0';
    	pq=&q[0];
    	
    	while ((*ps)!='\n') 
    	{
    		if ((*pq)==(*ps)) 
    		{
    			position++;
    			printf("\nGleichheit bei Position %d",position);
                            pq++;
    
    		}
    		ps++;
    	}
    	return 0;
    }
    Ich lese also erst die beiden Strings s und q über ihre Zeiger ein, schließe den String mit einem '\0' nach der Schleife ab und setze die Zeiger dann wieder auf den Anfang ihrer Felder und kontrolliere in einer weiteren while-Schleife, ob der Inhalt der beiden Zeiger gleich ist. Die Stelle von gleichen Stellen gebe ich über printf mit Hilfe der integer-Variable "position" aus. Das passiert dann solange der erste String noch nicht zu Ende ist (!='\n').

    Mein Problem ist nun leider, dass er mir bei jeder Position eine Gleichheit ausgibt. Fällt jemandem auf was ich verkehrt mache? Möglicherweise kann man Felder garnicht auf diese Art und Weise miteinander vergleichen, dann vergebt mir mein Halbwissen^^

    Danke für jegliche Hilfe im Voraus!

    Gruß
    MarCus


    Edit: "fpurge(stdin)" sorgt auf meinem Macbook für die Löschung des bisherigen Eingabepuffers
     
    #1 MarCus88, 04.12.09
    Zuletzt bearbeitet: 04.12.09
  2. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Warum so kompliziert?
    Code:
    int strcmp (const char * s1, const char * s2)  // const bedeutet unveränderbar
    {
     /*Die Bedingung ist, dass die von s1 und s2 referenzierten Werte gleich sind, sonst wird abgebrochen. s1 und 12 werden inkrementiert, damit die nächsten Werte verglichen werden. */
        for(; *s1 == *s2; ++s1, ++s2)  /
            if(*s1 == 0) //wenn S1 gleich 0 ist, wird die Funktion abgebrochen und gibt 0 zurück, die Strings sind gleich.
                return 0;
        return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1; //wenn s1<s2 dann gib -1 zurück , sonst 1. 
    }
     
    #2 Jamsven, 04.12.09
    Zuletzt bearbeitet: 04.12.09
  3. MarCus88

    MarCus88 Alkmene

    Dabei seit:
    29.10.09
    Beiträge:
    31
    @Jamsven

    Danke für deine Hilfe, ich lerne jetzt allerdings erst C, von daher verstehe ich deinen Code nicht vollständig. Könntest du ihn für mich kurz kommentieren?

    Edit: Konkret verstehe ich die letzte Zeile nicht.
     
  4. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Warum so kompliziert?
    Code:
    int strcmp (const char * s1, const char * s2)  // const bedeutet unveränderbar
    {
     /*Die Bedingung ist, dass die von s1 und s2 referenzierten Werte gleich sind, sonst wird abgebrochen. s1 und 12 werden inkrementiert, damit die nächsten Werte verglichen werden. */
        for(; *s1 == *s2; ++s1, ++s2)  /
            if(*s1 == 0) //wenn S1 gleich 0 ist, wird die Funktion abgebrochen und gibt 0 zurück, die Strings sind gleich.
                return 0;
        return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1; //wenn s1<s2 dann gib -1 zurück , sonst 1. 
    }
    das *(unsigned char *) ist ein expliziter Cast(Typumwandlung) von einem const char Pointer zu einem unsigned char Pointer. Der Stern außerhalb der runden Klammer gibt den referenzierten Wert zurück.
    Du kannst eine bedingte Zuweisung schreiben:
    Code:
    int max;
    int x=6;
    int y=4;
    max = (x > y) ? x : y; //max bekommt den wert von x
    y=10;
    max = (x > y) ? x : y; //max bekommt den wert von y
    y=6;
    max = (x > y) ? x : y; //max bekommt den wert von x und y
     
  5. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    Oder mit deinem Code:

    Code:
    while ((*ps)!='\n')
    
    wird zu:
    Code:
    while (((*ps)!='\0') && ((*pq)!='\0')) 
    
    Bei sowas hilfts meistens den Debugger anzuschmeißen und mal zu schaun was denn im Speicher steht und warum irgendwelche Bedingungen nicht zutreffen! (Doppelklick auf die Zeilennummer um einen Breakpoint zu setzten, dann mit Build and Debug den Debugger starten.)
     
  6. MarCus88

    MarCus88 Alkmene

    Dabei seit:
    29.10.09
    Beiträge:
    31
    @Jamsven:
    Dass es auf char unterschiedliche Pointer gibt, wusste ich garnicht^^ Ich dachte immer, dass die Typisierung vom Pointer auf ein character-Feld die schärfste Präzisierung ist.

    Daher verstehe ich deinen Code immernoch nicht so recht, nimms mir nicht übel, bin halt noch ein "blutiger Anfänger" wenn du so willst, trotzdem danke dir für die Erläuterung.

    @Gogul:
    Stimmt, die Variante hatte ich vorher auch einmal ausprobiert, allerdings dort wohl etwas anderes im Code versaubeutelt, das funktionierte bei mir nämlich nicht. Ich werd es mit dem Code allerdings auch nochmal probieren, danke dir auch für deine Hilfe

    Gruß
    MarCus
     
  7. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Es gibt nur eine Art von Speicheradressen. Aber mit der Typisierung weiß das Programm welcher Datentyp die Daten hinter der Adresse haben.
     
    #7 Jamsven, 08.12.09
    Zuletzt bearbeitet: 08.12.09
  8. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Im dritten Fall bekommt max auch den Wert von y zugewiesen, weil x nicht größer als y ist. Einer Variablen zwei Werte zuweisen geht nicht. ;)

    MacApple
     
  9. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Das ist vollkommen richtig.
     

Diese Seite empfehlen