www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit strstr()


Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht 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");
  }

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind da vielleicht Binär-Nullen vor dem gesuchten String im Puffer?

Autor: Bernd E. (edi)
Datum:

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Im Gegensatz zu strstr sucht Funktion memmem in Speicherblöcken,
deren Ende durch eine Größenangabe definiert ist:
#include <string.h>
void *memmem(const void *haystack, size_t haystacklen,
             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.

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mein WinAVR kennt leider keine memmem() Funktion!

Wie könnte ich die selbst machen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, habe schon einen laufenden Code zusammengebracht!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.