Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » mystrcmp

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
19.04.2005, 01:59 Uhr
ao

(Operator)



Zitat von Pablo:


Zitat:
@tunis:
Eine Standard-konforme strcmp-Implementierung gibt nach meinem Infostand nicht notwendigerweise 1 oder -1 zurück, sondern irgendeinen positiven bzw. irgendeinen negativen Wert,


ich glaube, das hängt von der jeweiligen C Implemntierung ab. Bei mir (glibc 2.3.4.20041102) bekomme ich immer -1 oder 1

Natürlich hängt das von der Implementierung ab, wovon denn sonst? Aber der Standard ist nicht so restriktiv, +1 oder -1 vorzuschreiben, sondern überlässt die Entscheidung dem Library-Designer. Und das ist gut so.

ao

Dieser Post wurde am 19.04.2005 um 02:00 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
19.04.2005, 02:39 Uhr
Pablo
Supertux
(Operator)



Zitat von Windalf:

bei der implementierung mit strlen und []dereferenzierung dreht sich bei mir die magenwand um....


dann solltest du vielleicht weniger in der Nacht essen, lieber windalf.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
19.04.2005, 08:13 Uhr
~Pler(2)
Gast


@ao:

Definition:

Zitat:

int strcmp( const char* kett , const1 char* kett2 );

vergleicht die beiden Strings kett1 und kett2 byteweise und liefert einen positiven Wert ( wenn kett1 > kett 2 ) und einen negativen Wert ( wenn kett1 < kett2 ) oder 0 ( wenn kett1 und kett2 völlig gleich sind ).
Der Rückgabewert ist die Differenz der beiden ersten nicht übereinstimmenden Zeichen in kett1 und kett2.



Ist also schon soweit richtig ( -> mit 1 und -1 stimmt nicht ); allerdings habe ich nicht unterschieden, welcher der Beiden groesser ist; da haste Recht.

Das ist die Definition, die ich kenne; von Abweichungen in den verschiedenen Lib. habe ich noch nie was gehoert; und weis auch nicht wieso das gut sein soll ??
Was hat das noch mit Standard zu tun?
Wenn ich mich auf sowas nicht verlassen kann, kann ich ja nie in Quellcode sowas einbauen, der später wo anders übersetzt wird. Oder man muesste wenigstens wissen, dass es da Abweichungen gibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
19.04.2005, 08:20 Uhr
~Pler(2)
Gast


Oder sollte mit Differenz tatsächlich bedeuten, dass 'a' und 'c' dann zb 2 liefern ???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
19.04.2005, 09:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

dann solltest du vielleicht weniger in der Nacht essen, lieber windalf.



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
19.04.2005, 09:54 Uhr
ao

(Operator)



Zitat von ~Pler(2):
@ao:
int strcmp( const char* kett , const1 char* kett2 );

vergleicht die beiden Strings kett1 und kett2 byteweise und liefert einen positiven Wert ( wenn kett1 > kett 2 ) und einen negativen Wert ( wenn kett1 < kett2 ) oder 0 ( wenn kett1 und kett2 völlig gleich sind ).
Der Rückgabewert ist die Differenz der beiden ersten nicht übereinstimmenden Zeichen in kett1 und kett2.

Ich hab keinen Standard zur Hand, aber alle Beschreibungen, die ich finde (K&R, manpages, Microsoft-MSDN, etliche Suchtreffer im WWW), decken sich mit dem, was ich oben geschrieben habe und damit auch mit dem ersten Satz deiner Definition.

Dein zweiter Satz geht viel weiter und legt genau fest, wie der Rückgabewert zu berechnen ist. Leider ist das abhängig von der verwendeten Codetabelle, und die ist systemabhängig. Darum ist der genaue Wert nicht aussagekräftig, sondern wiederum nur das Vorzeichen.

Wo stammt denn diese Definition her?

Zitat:
von Abweichungen in den verschiedenen Lib. habe ich noch nie was gehoert; und weis auch nicht wieso das gut sein soll ??
Was hat das noch mit Standard zu tun?

Der Standard legt das Minimum dessen fest, was eine konforme Bibliothek leisten muss. Eine konkrete Implementierung kann innerhalb dieser Grenzen tun, was sie will. Und bei strcmp ist eben nur das Vorzeichen des Rückgabewerts vorgeschrieben.

Der Vorteil liegt im Optimierungs-Potenzial. Diese Standard-Bibliotheken werden für jede Implementierung hoch optimiert und speziell auf die Möglichkeiten des Zielsystems zugeschnitten. Und je nachdem, welche Vergleichsbefehle die CPU hat, kann es auf einem System besser sein, die arithmetische Differenz zweier Zeichen zu berechnen und direkt zurückzuliefern, und auf einem anderen System besser, das Vergleichsergebnis aus irgendwelchen Flaggenregistern abzuleiten, was dann eher zu immer denselben positiven und negativen Rückgabewerten führen wird.

Es ist darum durchaus sinnvoll, solche Detail-Entscheidungen dem Library-Designer zu überlassen und nicht bis ins Letzte im Standard festzuschreiben.


Zitat:
Wenn ich mich auf sowas nicht verlassen kann, kann ich ja nie in Quellcode sowas einbauen, der später wo anders übersetzt wird. Oder man muesste wenigstens wissen, dass es da Abweichungen gibt.

Du kannst dich auf das verlassen, was der Standard garantiert. Auf alles, was darüber hinausgeht, solltest du dich nicht zu fest verlassen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
19.04.2005, 11:16 Uhr
~Pler(2)
Gast


Ich habe das aus der C-Kompaktreferenz von Helumt Herold.

Wenn das so stimmt wie du das sagst, wovon ich jetzt auch ausgehe; denn die man-Pages stimmen ja damit ueberein - dann waer es ja schlecht sowas einfach in einem Buch zu behaupten...

Danke fuer die ausfuerliche Erklaerung mit den Libs! Hast mich ueberzeugt.
Aber Probleme entstehen eben dann schon, wenn jemand eine spezielle Implementierung als Standard ausgibt.?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
19.04.2005, 12:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich kenn das auch nur so wie ao beschreibt und würde es in etwa so implementieren

ungetestet

C++:
int mystrcmp(const char* str1, const char* str2){
    char *p,*q;
    for(p=str1,q=str2;*p&&*q&&*p==*q;++q,++p);
    return *p-*q;
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 19.04.2005 um 12:40 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
19.04.2005, 12:44 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf

da ist aber noch deutlich optimierungspotential (Zuviel vergleiche, überflüssige Variablen) drin:

C++:
int mystrcmp(const char* a, const char* b) {
    while(*a && *a==*b)  ++a, ++b;
    return *a-*b;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
19.04.2005, 12:47 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
ok den &&*q lass ich mir gefallen aber die zusätlichen pointer hab ich nur genommen um dir ne freude zu machen da du sonst maulst wenn ich die übergebenen paramter verhunze. jetzt machst du es selber
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: