[C] Teilen eines Strings bei Doppelbuchstaben

Googlehupf

Erfahrenes Mitglied
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

C++:
//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^^.

C++:
#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);
}
 
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.

C++:
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ß
 
Zuletzt bearbeitet:
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)
C++:
//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
 
Zuletzt bearbeitet:
Hier etwas einfacher angeschrieben:
C++:
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ß
 
Zuletzt bearbeitet:
C++:
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.?
 
Hi.
C++:
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?!)
Aber eins verstehe ich nicht.

Hier z.B:
C:
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.

C:
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.
C:
++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.
C:
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]);
}
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:
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ß
 
Zuletzt bearbeitet:
Zurück