tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
188
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Hallo zusammen!

    Die Aufgaben etc. stehen eigentlich schon in den Comments .

    Ich weis nicht wie ich da genau vorgehen soll.

    Soll ich z.b. die länge des gesamten Strings zählen, so wie man das halt beim zusammenfügen eines Strings macht?

    MfG Googlehupf

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    //Aufgabe: Schreiben Sie ein Programm das Wörter teilt, wenn Doppelbuchstaben vorkommen.
    //
    //Beispiel:
    //String A: Wetter -> Das "ter" dann in nen neuen String rein --> String A: "Wet" und String B: "ter"
     
    #include <stdio.h>
     
    #define MAX_LEN 100
     
    void share(char a[], char b[]);
     
    void share(char a[], char b[])
    {
      int x=0;
      int i=0;
     
      while(a[x] != '\0')
      {
        if(a[x] == a[x+1])
        {
          a[x]='\0';
          b[i]=a[x+1];
        }
      }
    } 
     
    int main()
    {
      char a[MAX_LEN]; // Gesamter String
      char b[MAX_LEN]; //In diesem String soll dann die 2. Hälfte des Wortes stehn, wenn ein Doppebuchstaben vorhanden is. Im oberen Bespiel: "ter"
     
      printf("Eingabe(1 Wort):\n");
      gets(a);
     
      printf("1. Hälfte: %s\n",a);
      printf("2. Hälfte: %s\n",b);
     
      return(0);
    }

    Das zusammenfügen eines Strings:
    Das ist mir irgendwie viel leichter gefallen wie das andere Bsp.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
     
    #include <stdio.h>
     
    #define MAX_LEN 200
     
    void strcat(char a[], char b[]);
     
    int zaehlen(char a[]);
     
     
    void strcat(char a[], char b[])
    {
        int i=0;
        int laenge=0;
     
        laenge = zaehlen(a);
     
        a[laenge] = ' ';
     
        do
        {
            a[laenge+1]=b[i];
     
            i++;
            laenge++;
        }
        while(b[i]!='\0');
     
        a[laenge+1]='\0';
    }
     
    int zaehlen(char a[])
    {
     int laenge=0;
     
     do
     {
      laenge++;
     }
     while(a[laenge] != '\0');
     
     return laenge;
    }
     
    int main (void)
    {
        char a[MAX_LEN];
        char b[MAX_LEN];
     
        printf("Geben Sie bitte 2 Woerter ein.\n");
        printf("Wort1: ");
        gets(a);
        printf("Wort2: ");
        gets(b);
        strcat(a,b);
        printf("\nNeuer string: %s\n",a);
    }
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    zu share: Warum zählen?
    Zuerst den ersten String durchgehen, bis man einen Doppelbuchstaben oder das Stringende findet.
    Wenn Stringende: Einen Leerstring in den zweiten und Ende.
    Sonst: Da den ersten String abschneiden, ab da Buchstaben bis zum alten Stringende in den zweiten kopieren.

    Und strcat ist auch unnötig kompliziert...
    Ich schreib mal ein Codebeispiel.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    char *mystrcat(char *z, const char *q)
    {
        while(*z) z++;
        while(*q) *(z++) = *(q++);
        *z = '\0';
        return z;
    }
     
    void myshare(char *a, char *b)
    {
        if(*a == '\0') return;
        while(*(a + 1) && *a != *(a + 1));
        a++;
        if(*a == '\0')
        {
            *b = '\0';
            return;
        }
        *(b++) = *a;
        *(a++) = '\0';
        while(*a) *(b++) = *(a++);
        *b = '\0';
    }

    Ungetestet.

    Gruß
    Geändert von sheel (22.08.11 um 13:55 Uhr)
    Googlehupf bedankt sich. 

  3. #3
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Es ist sehr nett von dir, für mich extra nen Code zu schreiben. Danke, wirklich! .

    Sorry, aber leider kann ich ihn nicht entziffern, solche Schreibweise lernen wir nicht, oder "noch" nicht ich weis es nicht.

    Ich hab es jetzt so hingebracht das beim String a "Hal" da steht und beim String b "l".(Die Eingabe ist: Hallo)
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    //Aufgabe: Schreiben Sie ein Programm das Wörter teilt, wenn Doppelbuchstaben vorkommen.
    //
    //Beispiel:
    //String A: Wetter -> Das "ter" dann in nen neuen String rein --> String A: "Wet" und String B: "ter"
     
    #include <stdio.h>
     
    #define MAX_LEN 100
     
    void share(char a[], char b[]);
     
    void share(char a[], char b[])
    {
      int i=0;
      int x=0;
     
      while(a[x] != '\0')
      {
        if(a[x] == a[x+1])
        {
          b[i]=a[x+1];
          a[x+1]='\0';
        }
        x++;
        i++;
      }
     
      b[i]='\0';
    } 
     
    int main()
    {
      char a[MAX_LEN]; // Gesamter String
      char b[MAX_LEN]; //In diesem String soll dann die 2. Hälfte des Wortes stehn, wenn ein Doppebuchstaben vorhanden is. Im oberen Bespiel: "ter"
     
      printf("Eingabe(1 Wort):\n");
      gets(a);
     
      share(a,b);
     
      printf("1. Haelfte: %s\n",a);
      printf("2. Haelfte: %s\n",b);
     
      return(0);
    }

    Grüße
    Geändert von Googlehupf (24.08.11 um 08:28 Uhr)
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hier etwas einfacher angeschrieben:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    void myshare(char *a, char *b)
    {
        if(*a == '\0') return;
        while(a[1] != '\0' && a[0] != a[1]);
        a++;
        if(a[0] == '\0')
        {
            b[0] = '\0';
            return;
        }
        b[0] = a[0];
        a[0] = '\0';
        b++;
        a++;
        while(a[0] != '\0')
        {
            b[0] = a[0];
            a++;
            b++;
        }
        b[0] = '\0';
    }

    edit:
    2 Fehler in deinem Code:
    1) Bleibt bei b ein Platz von a-Länge frei.
    Also zB. "Butter" wird zu:
    a: But
    b: ###ter
    wobei # irgendwas zufälliges ist.

    2) Schreibst du bei Butter nur das t in b, e und r werden wieder nicht erkannt, weil sie keine Doppelbuchstaben sind.

    Gruß
    Geändert von sheel (22.08.11 um 17:08 Uhr)
    Googlehupf bedankt sich. 

  5. #5
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void myshare(char *a, char *b) = void myshare(char a[], char b[]) Oder?
     
    Aber eins verstehe ich nicht.
     
    Hier z.B:
    while(a[0] != '\0')
    {
            b[0] = a[0];
            a++;
            b++;
    }
     
    Warum zahlst du da die "Strings" a und b ++.
     
    Du verwendest immer a[0].
     
    Warum net a[x] und dann x++ z.B.?
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Code cpp:
    1
    
    void myshare(char *a, char *b) = void myshare(char a[], char b[]) Oder?
    Ja.

    Das liegt daran, das Arrays im Grunde nur Zeiger sind. (Ihr hattet noch keine Zeiger, oder?!)
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Aber eins verstehe ich nicht.

    Hier z.B:
    Code c:
    1
    2
    3
    4
    5
    6
    
    while(a[0] != '\0')
    {
            b[0] = a[0];
            a++;
            b++;
    }

    Warum zahlst du da die "Strings" a und b ++.
    Das liegt daran, weil Strings im Grunde nur Zeiger sind...

    Zeiger zeigen auf bestimmte Dinge, bzw. merken sich die Adresse von anderen Dingen.

    Code c:
    1
    
    const char* x = "abc";
    x ist ein Zeiger. Der Zeiger x zeigt auf den String "abc" irgendwo im Speicher. D.h. in x ist die Adresse (eine Zahl) dieses Strings gespeichert. Der String selbst ist also z.B. ab Adresse 123 (da steht das 'a') gespeichert. Das 'b' hat dann die Adresse 124, 'c' 125 usw.
    Code c:
    1
    
    ++x;
    Inkrementiert den Zeiger. D.h. der Zeiger x speichert nicht mehr die Adresse 123, sondern 124. D.h. er zeigt nicht mehr auf das 'a', sondern auf das 'b' - oder man könnte auch sagen er zeigt auf den String "bc", da der Zeiger eben einfach eine Position weiter nach rechts gerückt ist.
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    int main() {
      char s[] = "ABC";
      char* p = s;
     
      printf("Adresse von \"ABC\": %p\n", s);
     
      printf("gespeicherte Adresse: %p\n", p);
      printf("Wert von p: %c\n", *p);
      printf("s[0]: %c\n", s[0]);
     
      ++p;
     
      printf("gespeicherte Adresse: %p\n", p);
      printf("Wert von p: %c\n", *p);
      printf("s[1]: %c\n", s[1]);
     
      ++p;
     
      printf("gespeicherte Adresse: %p\n", p);
      printf("Wert von p: %c\n", *p);
      printf("s[2]: %c\n", s[2]);
    }
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Du verwendest immer a[0].

    Warum net a[x] und dann x++ z.B.?
    Das wäre auch möglich. So spart man sich allerdings eine extra Variable und die Berechnung beim Indexzugriff.

    Der Zugriff über den Index ist nämlich nur "syntaktischer Zucker":
    Code :
    1
    
    a[x] === *(a+x)
    a[x] bedeutet also dasselbe wie den Zeiger erstmal um x Stellen "weiter zu schieben" und dann auf den Wert zuzugreifen.

    Gruß
    Geändert von deepthroat (24.08.11 um 09:14 Uhr)
    Googlehupf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Strings Splitten / Teilen
    Von Davicito im Forum C/C++
    Antworten: 18
    Letzter Beitrag: 22.05.11, 17:18
  2. Zeilenausgabe eines Strings
    Von Benzol im Forum PHP
    Antworten: 4
    Letzter Beitrag: 25.02.06, 16:30
  3. Teilen eines Word-Dokumentes
    Von Kolboy im Forum Office-Anwendungen
    Antworten: 1
    Letzter Beitrag: 01.05.05, 04:46
  4. Teile eines Strings
    Von duermer im Forum Java
    Antworten: 1
    Letzter Beitrag: 30.10.04, 18:04
  5. 1. Buchstaben eines Strings
    Von DaRealF1 im Forum PHP
    Antworten: 7
    Letzter Beitrag: 28.01.03, 19:10