C: Wie kann ich ein Pointer-Array anlegen, um die Fundstellen zu speichern?

1 Antwort

int vector[10]; /* Array von 10 Ints */
int *vector[10]; /* Array von 10 int Pointern  */
char z[10]; /* Array von 10 Zeichen */
char s[]; /* Char Array unbekannter Länge, wird bei Aufruf */
char *s; /* zu einem char Pointer */
char *s[10]; /* 10 char ptr */ 
char *s[]; /* Array char prts */ 
char **s; 

Wenn Du ein Match findest, setzt DU eben einen weiteren Pointer im Array auf die Fundstelle. Vorzugsweise initialisierst Du das Array mit NULL-Ptrs.

OSaft111 
Fragesteller
 12.04.2021, 22:19

Danke könntest du das mit einem bsp. erklären weil so wirklich habe ich das nicht geblickt.

0
KarlRanseierIII  12.04.2021, 22:52
@OSaft111

Hier nur ein vereinfachtes Beispiel, statisches Array, Matching auf einzelnes Zeichen, denn Deine Übungen mußt Du schon selbst erledigen:

#include <stdio.h>

int main (){
        char s[]="Hallo Welt, dies ist ein einfacher kurzer String zur Demonstration";
        char *matches[32];
        for(int i=0;i<32;++i) matches[i]=NULL;
        char *n=s;
        printf("Needle: %s\n",n);
        int pos=0;
        while(*n){
           if (*n=='e') matches[pos++]=n;
           ++n;
        }
        for(int i=0;matches[i];++i) printf("String @ %p, Match @ %p. Offset: %ld\n",s,matches[i],matches[i]-s);
}

Ausgabe:

Needle: Hallo Welt, dies ist ein einfacher kurzer String zur Demonstration
String @ 0x7ffc74749150, Match @ 0x7ffc74749157. Offset: 7
String @ 0x7ffc74749150, Match @ 0x7ffc7474915e. Offset: 14
String @ 0x7ffc74749150, Match @ 0x7ffc74749165. Offset: 21
String @ 0x7ffc74749150, Match @ 0x7ffc74749169. Offset: 25
String @ 0x7ffc74749150, Match @ 0x7ffc74749170. Offset: 32
String @ 0x7ffc74749150, Match @ 0x7ffc74749177. Offset: 39
String @ 0x7ffc74749150, Match @ 0x7ffc74749186. Offset: 54
1
OSaft111 
Fragesteller
 13.04.2021, 09:58
@KarlRanseierIII

Danke was mir auch recht unklar ist wie man ein zeichenkette so wie sie ist in einem Text vergleicht also wenn die if bedingung nur dann wahr ist wenn z.B "Hal" im Wort "Hallo" vorhanden ist also ich denke an einem Pointer der auf die 3 dreistellen "Hal" zeigt und gleichzeitig auf die ersten 3stellen von "Hallo" zeigt und 3 stellen auf einmal vergleicht und inkrementiert gibt es da eine Möglichkeit ?

0
KarlRanseierIII  13.04.2021, 11:50
@OSaft111

Du implementierst eine naive Variante von strcmp().

[such]
[Ein viel längerer Text, der zu durchsuchen ist]

Du vergleichst die Zeichen aus such (needle) einzeln mit dem haystack. Bei Unterschied return false, sonst true.

Nun widerholst Du das ganze, indem Du such verschiebst, also anstatt bei haystack[0] bei haystack[1] anfängst. Das machst Du natürlich nur bis len(haystack) - len(such).

Wann immer Dein strcmp() also matcht, merkst Du dir den Pointer auf das Startzeichen.

------

Erste Verbesserung, anstatt true and false, lässt Du strcmp NULL und Pointer auf letztes Zeichen des Matches im Haystack zurückgeben, da du keien überlappenden Matches ersetzen kannst.

0