Forum: Compiler & IDEs Problem mit strstr()


von Bernd E. (edi)


Lesenswert?

Hallo,
ich habe ein Problem mit strstr, ich lese 512 Byte in einen Puffer ein 
und möchte feststellen, ob der String FAT16 darin enthalten ist, aber 
ich komme immer nur in den else Zweig, egal ob der gesuchte string im 
Puffer ist oder nicht.


unsigned char buffer[BLOCKSIZE];

  /* read Master Boot Record from SD Card at address 0x00 */
  sd_SPI_read_block(MBR, buffer);

  //buffer[511] = "\0";
  //lcd_putc(buffer[54]);

  /* if no MBR found, firs_vbr_addr = 0 */
  if(strstr(buffer, "FAT16") != NULL) // != NULL wenn String gefunden = 
kein MBR vorhanden!
  {
    first_vbr_addr = 0;
    lcd_puts("No MBR found!\n");
  }
  else
  {
    /* calculate address of the volume boot record */
    first_vbr_addr = buffer[VBR] + (buffer[VBR+1] << 8);
    lcd_puts("MBR found!\n");
  }

von Uhu U. (uhu)


Lesenswert?

Sind da vielleicht Binär-Nullen vor dem gesuchten String im Puffer?

von Bernd E. (edi)


Lesenswert?

Hi,
könnte sein, da stehen alle möglich Daten drin! Würde dir Funktion dann 
abbrechen?

von yalu (Gast)


Lesenswert?

Ja. Im Gegensatz zu strstr sucht Funktion memmem in Speicherblöcken,
deren Ende durch eine Größenangabe definiert ist:
1
#include <string.h>
2
void *memmem(const void *haystack, size_t haystacklen,
3
             const void *needle, size_t needlelen);

memmem ist nicht im C-Standard enthalten, aber sowohl in der Glibc als
auch in der AVR-Libc. Notfalls kannst du diese Funktion auch schnell
selbst schreiben.

von Bernd E. (edi)


Lesenswert?

Hallo,
mein WinAVR kennt leider keine memmem() Funktion!

Wie könnte ich die selbst machen?

von Karl H. (kbuchegg)


Lesenswert?

Bernd Edlinger wrote:
> Hallo,
> mein WinAVR kennt leider keine memmem() Funktion!
>
> Wie könnte ich die selbst machen?

So schwer ist das auch wieder nicht (wenn die Suchgeschwindigkeit
erst mal nicht 'so schnell wie möglich' sein soll.

Wie suchst du denn in einem Text nach einem bestimmten Wort?
Dein Suchwort sei zb. 4 Zeichen lang.
Du fängst im Text ganz vorne an. Dann vergleichst du die
nächsten 4 Zeichen mit deinem Suchwort und wenn alle 4 gleich
sind hast du das Wort gefunden.
Wenn sie nicht gleich sind, dann betrachtest du den Text
vom nächsten Zeichen weg. Wieder: sind ab dieser Position
die nächsten 4 Zeichen mit dem Suchwort ident, dann hast
du das Wort an dieser Stelle gefunden.
Wenn nicht: Im Text die nächsten 4 Zeichen ab der Position 2
im Text vergleichen, wenn sies nicht sind, dann ab Position 3
etc. etc. bis du ganz am Ende des Textes - 4 Zeichen angelangt
bist und das Suchwort da nicht mehr enthalten sein kann.
Dann steht fest, dass das Suchwort da sicher nicht enthalten
ist.

Wie gesagt: Ist nicht unbedingt das schnellste, aber dafür
sehr simpel.

Überleg dir einfach, wie du im realen Leben solche Probemstellungen
löst und entwickle daraus (indem du dich selbst beobachtest)
einen Algorithmus. Solch ein Vorgehen ist sehr lehrreich!

von Bernd E. (edi)


Lesenswert?

Danke, habe schon einen laufenden Code zusammengebracht!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.