Stringfunktionen erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Stringfunktionen erstellen

    Hi

    kann mir vieleicht jemand helfen, diese Aufgabe zu lösen ..?
    ehrlich gesagt habe ich keine ahnung, wie mann Fkt. erstellen kann :( ...

    Das ist die Aufgaben stellung:

    Thema: String-Funktionen (char-Vektoren, Zeiger als Fkt.parameter)





    Schreiben Sie eigene Funktionslösungen, die genau so arbeiten wie die entsprechenden C-Standardfunktionen. Mögliche Kandidaten:

    - strlen

    - strcpy, strncpy

    - strcat





    Anforderungen: - der Prototyp Ihrer Lösung muss dem der jeweiligen Standardfunktion entsprechen,

    der Funktionsname soll <Zusatz>+<Std.Funktionsname> sein, also z.B. mystrlen für Ihre strlen-Lösung,

    - das Verhalten muss identisch dem der Std.fkt. sein; das betrifft auch die jeweiligen

    Voraussetzungen, Vorbedingungen, Ergebnisse etc.


    - Test: wenden Sie Ihre Funktionen für typische und Grenzfälle an.


    - Programmstruktur: Teilen Sie Ihr Programm auf in ein Anwendungsmodul (Test der

    Funktionen) und ein Modul mit den Funktionsdefinitionen, schreiben Sie eine eigene

    Headerdatei mit den Prototypen Ihrer Funktionen.


    Tauschen Sie Ihre Lösungen gegenseitig aus (C-Modul u. Headerdatei), und geben Sie Rückmeldungen an den jeweiligen Austauschpartner.





    und ich werde wirklich sehr dankbar sein falls jemand was zu den Aufgabenlösung zu sagen hat ...
  • In C gibt es ja kein echtes Stringkonzept, ein String ist eigentlich nur ein Char-Array dessen letzter Eintrag \0 sein muss. Wenn du also z.B. strlen implementierst bekommst du einen Zeiger auf das erste Char übergeben und du musst nur iterativ durch das Array laufen bis du \0 findest und dabei mitzählen.


    Du weißt nicht wie man in C eine Funktion scheibt? Sieht im Gerüst ungefähr so aus:

    Quellcode

    1. int mystrlen(char* s) {
    2. ...
    3. return ...;
    4. }
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Ich habe die Funktionen selbst kürzlich gebraucht. Klingt zwar als solltest du erstmal einen Gang zurückschalten und die Basics nachholen, aber du musst selbst wissen, was du damit anfängst:

    Quellcode

    1. int strlen(char *s) {
    2. int i=0;
    3. while(*s++ != 0)
    4. i++;
    5. return i;
    6. }
    7. void strcopy(char *s, char *t) {
    8. while((*s++ = *t++) != 0) ;
    9. }
    10. void strcat(char *s, char *t) {
    11. while(*s)
    12. s++;
    13. while(*s++ = *t++);
    14. }
    Alles anzeigen
  • Ich würde diese Funktionen nur verwenden, wenn du genau weißt was die machen. Die sind zum einen nämlich recht tricky programmiert (für einen Anfänger schlecht lesbar) zum anderen solltest du sie erweitern, da sie teilweise fehlerhaft oder unvollständig sind. Du solltest fit in C und Zeigerarithmetik sein, sonst merkt der Lehrer recht schnell, dass du das ausm Internet hast.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • hi

    sry, das gehört jetzt nich zum thema, aber ich hab ne frage...

    wegen dem unterschied zwischen var++ und ++var

    wenn man da jetzt in zeile 3 das while(*s++ != 0) ansieht, dann wird doch erst verglichen, und dann ++ gemacht, oder?
    also wenn man while(++*s != 0) hätte, würde er ja erst eins raufzählen und dann vergleichen...?

    interessiert mich schon länger, aber ich hab nie wirklich begriffen wo der unterschied is...
    danke, fals jmd sagt wies jetzt is ^^

    -pocky-
  • Du hast es doch vollkommen erfasst. Bei var++ (Postinkrement) wird der Wert der Variablen zurückgeliefert UND DANN einer draufaddiert, bei ++var (Präinkrement) wird ERST einer draufaddiert und dann der neue Wert von var zurückgegeben. In dem Code oben ist es richtig verwendet, weil sonst das erste Element jeweils ausgelassen würde.

    Noch eine Anmerkung dazu: In Fällen wo es egal ist was von beiden gemacht wird, (weil der Ausdruck nicht in einem anderen Ausdruck steht, z.B. for-Schleifen), sollte die Präinkrement-Variante gewählt werden, obwohl man es fast immer andersrum sieht (der Name C++ ist ja schon verkehrt).
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa...
    Vielen dank für deine Hilfe, aber das was du geschrieben hast weiß ich eigentlich ... was ich nicht wusste ist wie ich das genau machen soll ..
    torotzdem: Vielen Dank :)

    d0nUt ...
    Es ist nett von dir, die Funktionen zu schreiben, aber sie sind viel zu kompliziert für mich ,, den ich bin eine schlechte C anfängerin :? ,, deswegen habe ich nicht viel von dein quelltext verstanden


    und es sollte ungefähr so aussehen:


    *.h:

    Quellcode

    1. int my_strlen(const char *text);
    2. char*my_strcpy(char *ziel,const char *text);
    3. char*my_strcat(char *ziel,const char *text);




    Quellcode

    1. char*my_strcat(char *ziel,const char *quelle)
    2. {
    3. int i1,i2;
    4. for(i1=0;ziel[i1];++i1);
    5. for(i2=0;quelle[i2];++i1,++i2)
    6. ziel[i1]=quelle[i2];
    7. ziel[i1]=quelle[i2];
    8. return ziel;
    9. }
    10. char*my_strcpy(char *ziel,const char *quelle)
    11. {
    12. int i;
    13. for(i=0;quelle[i];++i)
    14. ziel[i]=quelle[i];
    15. ziel[i]='\0';
    16. return ziel;
    17. }
    18. int my_strlen(const char *text)
    19. {
    20. int i;
    21. for(i=0;text[i];++i);
    22. return i;
    23. }
    Alles anzeigen




    main.c:

    Quellcode

    1. void main(void)
    2. {
    3. int x,eingabe=0;
    4. printf("wollen sie : 1.strlen\n 2.strcpy\n 3.strcat\n
    5. do
    6. {
    7. x=scanf("%d",&eingabe);
    8. }while(!x);
    9. if(eingabe==1)
    10. {
    11. char text[ANZ];
    12. printf("geben sie einen text ein um seine lange zu bestimmen\n");
    13. fflush(stdin);
    14. gets(text);
    15. printf("Der Vector ist %d Elemente lang\n",my_strlen(text));
    16. }
    17. else if(eingabe==2)
    18. {
    19. char ziel[ANZ];
    20. char quelle[ANZ];
    21. printf("geben sie einen text ein um ihn zu kopieren\n");
    22. fflush(stdin);
    23. gets(quelle);
    24. my_strcpy(ziel,quelle);
    25. printf("Original : %s\n",quelle);
    26. printf("Kopie : %s\n",ziel);
    27. }
    28. else if(eingabe==3)
    29. {
    30. char quelle[ANZ];
    31. char ziel[ANZ];
    32. fflush(stdin);
    33. printf("geben sie einen text an den angehangt wird\n");
    34. gets(ziel);
    35. printf("geben sie einen text ein der angehangt wird\n");
    36. gets(quelle);
    37. printf("%s\n",my_strcat(ziel,quelle));
    38. }
    Alles anzeigen



    Ich habe es von mein mitschüler bekommen .. natürlich habe ich da was geändert aber totdem wurde ich von mein Lehrer erwischt :( ,, naja ...


    Nochmal will ich euch für eure Hilfe danken

    . ,,, ,*
    . ( '-')/) a flower
    .(( ) for you!
    ..(,,),)..
  • Also char*my_strcpy() und char*my_strcat() habt ihr gar nicht so unterschiedlich gelöst. Mir sind da folgende Sachen aufgefallen:

    1. In der man-page zu strcpy steht folgendes:
    In the case where the length of src is less than that of n, the remainder of dest will be padded with null bytes.
    Das wird nicht beachtet.
    2. Es ist schlechter Stil in boolschen Ausdrücken Pointer implizit zu konvertieren. Man sollte immer sowas benutzen (ptr == null).
    3. Bei strcpy wird das \0 Zeichen nicht mitkopiert (bei d0nUt), bei dir wird das letzte Zeichen mit \0 überschreiben.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]