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 ]
000
18.04.2005, 18:05 Uhr
~tunis
Gast


Hallo Leute habe ein kleines Problem:

Schreiben Sie die Funktionen mystrlen() und mystrcmp() und testen sie diese, die sowohl die Funktion strlen(), also auch die Funktion strcmp() nachbilden.

Ich habe diese Aufgabe probiert. einiges geht .
ich schaffte es mit mystrlen aber mit mystrcmp kapier ich das
einfach nicht.

C++:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include"ConsoleFunctions.h"

int mystrlen(char string[]);
int mystrcmp(char s1[], char s2[]);

//Hauptprogramm

int main(void){
    char weiter='j'; //Variablendeklaration
    char string1[5];
    char string2[5];
    int laenge=0;
    int laenge1=0;

    do{
        clrscr(); //Löschen des Bildschirms
        printf("1.String: ");
        gets(string1); //String1 einlesen
        printf("2.String: ");
        gets(string2); //String2 einlesen

        laenge=mystrlen(string1);
        laenge1=mystrlen(string2);
        printf("Laenge: %d\n",laenge);
        printf("Laenge2: %d\n",laenge1);

        if(mystrcmp(string1,string2)==EXIT_SUCCESS){
            printf("Die Strings sind gleich!\n");
        }
        else{
            printf("Die Strings sind nicht gleich!\n");
        }




        printf("Wollen Sie das Programm nochmals ausfuehren(j/n)?\n");
        weiter=getch();
    }while((weiter=='j')||(weiter=='J'));

    return 0;
}

int mystrlen(char string[]){
    int i=0;
    

    while(string[i]!='\0'){

        if(string[i]!='\0'){
            i++;
        }
    
    }

    return i;
}



Mfg. tunis

edit mod: Benutze CPP Tags selber!

Dieser Post wurde am 18.04.2005 um 18:10 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2005, 18:18 Uhr
Pablo
Supertux
(Operator)


Zu deiner mystrlen: die if Anfrage ist überflüssig

C++:
int mystrlen(const char* a)
{
        int i=0;
        while(a[i] && ++i);
        return i;
}


reicht.

Zu der anderen Frage: was verstehst du denn nicht?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 18.04.2005 um 18:20 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2005, 18:40 Uhr
~tunis
Gast


versteh das ganze mystrcmp nicht
wie ich berprüfe ob alle zeichen gleich lauten
ob er ausgibt 1 dasheißt 1.folge größer als zweite folge oder
ob er ausgibt -1 dasheißt 1.folge kleiner als zweite folge

Mfg. tunis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2005, 19:38 Uhr
~tunis
Gast


Ich verstehe garnichts wie man das machen könnte.
mystrlen war ja leicht
aber das hier
wie man überprüft ob er 1 asugibt dasheißt 1string groesser als 2string
oder -1 dasheißt 1string kleiner als 2string
oder 0 dasheißt beide strings gleich

Mfg.tunis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.04.2005, 21:07 Uhr
~Pler(2)
Gast


Keine Garantie aber mit den drei Test funktioniert es.


C++:
#include <stdio.h>

int main( void )
{
    char
        string1[16] = "Hallo",
        string2[16] = "Hallo",
        string3[16] = "Hall",
        string4[16] = "Halla";

    printf( "%d\n" , mystrcmp( string1 , string2 ) );
    printf( "%d\n" , mystrcmp( string1 , string3 ) );
    printf( "%d\n" , mystrcmp( string1 , string4 ) );

    return 0;
}

int mystrcmp( char* string1 , char* string2 )
{
    int
        i;
    
    for( i = 0 ; 1 ; i++ )
    {
        if( string1[i] != string2[i] )
        {
            if( ( string1[i] == '\0' ) || ( string2[i] == '\0' ) )
                i--;
            return i;
        }
        else if( ( string1[i] == '\0' ) && ( string2[i] == '\0' ) )
        {
            return 0;
        }
    }
}



Gibt aus:

Code:
0
3
4

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.04.2005, 21:10 Uhr
~Pler(2)
Gast


Weis jetzt nicht genau wie strcmp bei dem zweiten Vergleich reagiert, kann sein, dass da auch 4 rauskommt. dann faellt die if-Bed. mit i-- einfach weg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.04.2005, 21:16 Uhr
~Pler(2)
Gast


Dann liese sich das ganz auch noch etwas mehr verkuerzen:


C++:
int mystrcmp( char* string1 , char* string2 )
{
    int
        i;
    
    for( i = 0 ; 1 ; i++ )
    {
        if( string1[i] != string2[i] )
            return i;
        else if ( string1[i] == 0 ) // oder string2[i] == 0
            return 0;
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.04.2005, 22:37 Uhr
ao

(Operator)


@Pler: Deine mystrcmp-Implementierung ist falsch, sie gibt im Ungleichheitsfall nicht -1 oder 1 zurück, sondern den Index des ersten abweichenden Zeichens, was 0 oder jeder positive Wert sein kann, unabhängig davon, welcher String der größere ist => leider Blödsinn.

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

www.cplusplus.com/ref/cstring/strcmp.html

D.h., eine mögliche Implementierung vergleicht Zeichen für Zeichen bis einer der Strings beendet ist (Null-Zeichen) oder sich vom anderen unterscheidet. Dann wird der Unterschied berechnet (Differenz) und zurückgegeben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.04.2005, 00:09 Uhr
Pablo
Supertux
(Operator)



Zitat von ao:

@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


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mystrcmp(const char* str1, const char* str2)
{
        size_t s1, s2, i=0;
        s1 = strlen(str1);
        s2 = strlen(str2);

        while(str1[i] && str2[i] && (str1[i] == str2[i])) ++i;

        if(s1 != s2)
                return str1[i] < str2[i] ? -1 : 1;

        return (i==s1 ? 0 : (str1[i] < str2[i] ? -1 : 1));
}

int main(int argc, char** argv)
{
        printf("  strcmp(\"%s\", \"%s\")=%d\n", argv[1], argv[2], strcmp(argv[1], argv[2]));
        printf("mystrcmp(\"%s\", \"%s\")=%d\n", argv[1], argv[2], mystrcmp(argv[1], argv[2]));
        return 0;
}



Ich bekomme z.b. immer dasselbe.

Bash:

rex@supertux:~/tmp> gcc strcmp.c -ostrcmp
rex@supertux:~/tmp> echo "\
> Hallo Hallo
> H0allo Hallo
> hallo hallo1
> hAlLo HaLlo
> amam mama
> 0xdeadbeef Oxdeadbeef" | awk '{ system("./strcmp " $1 " " $2)  }'
  strcmp("Hallo", "Hallo")=0
mystrcmp("Hallo", "Hallo")=0
  strcmp("H0allo", "Hallo")=-1
mystrcmp("H0allo", "Hallo")=-1
  strcmp("hallo", "hallo1")=-1
mystrcmp("hallo", "hallo1")=-1
  strcmp("hAlLo", "HaLlo")=1
mystrcmp("hAlLo", "HaLlo")=1
  strcmp("amam", "mama")=-1
mystrcmp("amam", "mama")=-1
  strcmp("0xdeadbeef", "Oxdeadbeef")=-1
mystrcmp("0xdeadbeef", "Oxdeadbeef")=-1


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.04.2005, 00:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:


C++:
int mystrcmp(const char* str1, const char* str2)
{
        size_t s1, s2, i=0;
        s1 = strlen(str1);
        s2 = strlen(str2);

        while(str1[i] && str2[i] && (str1[i] == str2[i])) ++i;

        if(s1 != s2)
                return str1[i] < str2[i] ? -1 : 1;

        return (i==s1 ? 0 : (str1[i] < str2[i] ? -1 : 1));
}




bei der implementierung mit strlen und []dereferenzierung dreht sich bei mir die magenwand um....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 19.04.2005 um 00:25 Uhr von Windalf editiert.
 
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: