www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einzelne Zeichen in einem String überprüfen.


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich habe da ein kleines Problem und zwar will ich in einem String das 
erste Zeichen überprüfen.
if ( strcmp ( Buffer[0], 'a' ) == 0 )
{
uart_puts ( "richtig" );
uart_putc( '\r' );
}
else
{
uart_puts ( "falsch" );
uart_putc( '\r' );
}
So habe ich das gelöst. Es funktioniert auch soweit, nur wenn ich das 
ganze Kompiliere kommen zwei Warnungen in der Zeile
if ( strcmp ( Buffer[0], 'a' ) == 0 )

../main.c:28: warning: passing argument 1 of 'strcmp' makes pointer from 
integer without a cast
../main.c:28: warning: passing argument 2 of 'strcmp' makes pointer from 
integer without a cast

Gibt es da vielleicht eine bessere Lösung um zu überprüfen ob das erste 
Zeichen z.B. ein „a“ ist?

Das ganze läuft auf einem Atmega32.
Ich hoffe der Programmschnipsel reicht, ansonsten liefere ich noch mehr 
;-)

Gruß Simon

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Statt
if ( strcmp ( Buffer[0], 'a' ) == 0 )

kannst du auch einfach
if ( Buffer[0] == 'a' )

schreiben.

Ansontens passen deine beiden Parameter nicht zum Funktionsaufruf von 
strcmp bzw. es wird ein automatischer Typecast durchgeführt und der kann 
auch ungewollte ergebnisse bringen, deshalb wird er vom Compiler 
markiert.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Buffer[0] ist das nullte zeichen "dereferenziert"

versuch mal:

strcmp ( &Buffer[0], 'a')


....odda lige ich da auch verkehrt?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>....odda lige ich da auch verkehrt?
JA

Mike S. hat schon die Lösung gefunden.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo das mit dem ungewolltem Ergebnis habe ich grade festgestellt :-D
Aber jetzt geht es.
Danke für die super schnelle Hilfe.
Gruß Simon

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

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
>>....odda lige ich da auch verkehrt?
> JA
>
> Mike S. hat schon die Lösung gefunden.

Wobei man noch sagen sollte, dass er die von Mike gepostete Lösung nicht 
einfach nur nehmen 'kann', sondern er sie nehmen muss. Das ist ein 
Unterschied. Wenn der OP meint

<Zitat>
So habe ich das gelöst. Es funktioniert auch soweit,
</Zitat>

dann hat er einfach nur nicht genau genug getestet, denn seine Lösung 
funktioniert definitiv nicht.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei man noch sagen sollte, dass er die von Mike gepostete Lösung nicht
einfach nur nehmen 'kann', sondern er sie nehmen muss.

Es könnte auch mit

strncmp ( Buffer[0], "a", 1)

gehen.

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

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:

> strncmp ( Buffer[0], "a", 1)

Nein, könnte es nicht.
Buffer[0] ist ein char und kein Zeiger auf das erste Zeichen.

   strncmp( &Buffer[0], "a", 1 )
   strncmp( Buffer, "a", 1 )

würde gehen, ist aber mit Kanonen auf Spatzen ...

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger
Klar das es nicht richtig geht, deswegen habe ich mich ja an dieses 
Forum gewannt. Nachdem ich gepostet hatte habe ich noch ein wenig rum 
probiert. Und ich habe bei einer Weiterverarbeitung auch viel murks 
rausbekommen. Nur im ersten Moment hatte es halt funktioniert.
Aber mit der Lösung von Mike geht es super gut und Fehler bekomm ich 
auch keine mehr.
Danke noch mal für die Hilfe

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

Bewertung
0 lesenswert
nicht lesenswert
Simon wrote:

> Aber mit der Lösung von Mike geht es super gut und Fehler bekomm ich
> auch keine mehr.


Die eigentlich wichtige Frage ist aber eine andere:

Weisst du, warum deine Lösung nicht funktionieren kann bzw. warum du es 
anders machen musst? Bzw. in etwas weiter gefasster Form: Ist dir der 
Unterschied zwischen einem einzelnen Zeichen (einem char) und einer 
Zeichenkette (einer Abfolge von einzelnen char) klar.

Alle str... Funktionen arbeiten immer auf Zeichenketten (vulgo Strings).
In C ist etwas was in einfache Gänsefüsschen eingeschlossen ist (also 
'a') immer ein einzelnes Zeichen, während ein String immer in doppelte 
Gänsefüsschen eingeschlossen wird (also "test")

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ja jetzt ist mir alles ein bisschen mehr klar.
Ich habe zuvor so gut wie nie mit Strings gearbeitet.
Hab eben auch ne gute Seite gefunden wo das mit den Stings gut 
beschrieben ist.
http://www.cplusplus.com/reference/clibrary/cstring/

Danke deinen Link werd ich mir auch noch mal zur Brust nehmen.
Bin halt noch Anfänger :-D

Gruß Simon

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

Bewertung
0 lesenswert
nicht lesenswert
Simon wrote:

> Bin halt noch Anfänger :-D

Kein Problem.
Strings sind die erste große Hürde, die es in C zu meistern gilt.

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten findet man noch ein ganz brauchbares C-Buch bei Galileo 
Computing:

http://openbook.galileocomputing.de/c_von_a_bis_z/

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.