Aufgabenstellung:

Wenn in einer Zeichenkette ein Zeichen unmittelbar hintereinander mehrfach vorkommt, so sollen diese Blöcke von gleichen Zeichen auf 1 Zeichen reduziert werden.
Die Lösung soll zwei Funktionen enthalten:
Eine Funktion suchen findet das erste Auftreten eines bestimmten Zeichens unmittelbar nebeneinander.
Eine Funktion entfernen entfernt ab der Position pos n Zeichen aus einer Zeichenkette.

Lösung:

/* MehrfachzeichenEntfernen.c */


#include <stdio.h>
#include <string.h>

/*  sucht, ob das Zeichen c als Mehrfachzeichen in s vorkommt       */
/*  *pos  Rueckgabewert: Anfangsposition des Vorkommens             */
/*  *n    Rueckgabewert: Wie oft steht das Zeichen nebeneinander    */

int suchen(char *s, char c, int *pos, int *n)
{
  int i = 0;
  int gefunden = 0;

  while (!gefunden && i < strlen(s)) {
    gefunden = (s[i] == c && s[i+1] == c);
    i++;
  }

  if (gefunden) {
    *pos = i; *n = 2; i = i + 2;
    while (s[i] == c) {
     (*n)++;
     i++;
    }
  }
  return gefunden;
}

/* Entfernt ab der Position pos n Zeichen aus der Zeichenkette s */

void entfernen (char *s, int pos, int n)
{
  int len = strlen(s);
  int i;

  /* Alle Zeichen ab pos + n, incl. Abschlusszeichen, nach vorne kopieren */
  for (i = pos+n; i <= len; i++)
    s[i-n] = s[i];
}

int main(void)
{
  char s[50];
  char find;
  int p, n;
  int r;

  printf("In einer Zeichenkette werden Bloecke von "
    "gleichen Zeichen auf ein Zeichen reduziert!\n\n");
  printf("Zeichenkette: "); gets(s);
  printf("Zeichen: "); scanf("%c", &find);
  printf("Entferne jetzt Mehrfachvorkommen des Zeichens %c\n\n", find);
  r = suchen(s, find, &p, &n);
  while (r) {
    /* printf("Info: %3i mal des Zeichen %c ab Index %3i gefunden\n", n, find, p); */
    entfernen(s, p, n-1);
    puts(s);
    r = suchen(s, find, &p, &n);
  }
  puts(s);
  return 0;
}