• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Stringvergleich in C

MarCus88

Alkmene
Registriert
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
 
Zuletzt bearbeitet:

Jamsven

London Pepping
Registriert
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. 
}
 
Zuletzt bearbeitet:

MarCus88

Alkmene
Registriert
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.
 

Jamsven

London Pepping
Registriert
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
 

Gogul

Uelzener Rambour
Registriert
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.)
 

MarCus88

Alkmene
Registriert
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
 

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
@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.

Es gibt nur eine Art von Speicheradressen. Aber mit der Typisierung weiß das Programm welcher Datentyp die Daten hinter der Adresse haben.
 
Zuletzt bearbeitet:

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
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
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