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


von Simon (Gast)


Lesenswert?

Hi
Ich habe da ein kleines Problem und zwar will ich in einem String das 
erste Zeichen überprüfen.
1
if ( strcmp ( Buffer[0], 'a' ) == 0 )
2
{
3
uart_puts ( "richtig" );
4
uart_putc( '\r' );
5
}
6
else
7
{
8
uart_puts ( "falsch" );
9
uart_putc( '\r' );
10
}
So habe ich das gelöst. Es funktioniert auch soweit, nur wenn ich das 
ganze Kompiliere kommen zwei Warnungen in der Zeile
1
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

von Mike R. (thesealion)


Lesenswert?

Moin,

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

kannst du auch einfach
1
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.

von ... (Gast)


Lesenswert?

Buffer[0] ist das nullte zeichen "dereferenziert"

versuch mal:

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


....odda lige ich da auch verkehrt?

von Peter (Gast)


Lesenswert?

>....odda lige ich da auch verkehrt?
JA

Mike S. hat schon die Lösung gefunden.

von Simon (Gast)


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

von Karl H. (kbuchegg)


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.

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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 ...

von Simon (Gast)


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

von Karl H. (kbuchegg)


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_funktioniert_String-Verarbeitung_in_C.3F

von Simon (Gast)


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

von Karl H. (kbuchegg)


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.

von Mike R. (thesealion)


Lesenswert?

Ansonsten findet man noch ein ganz brauchbares C-Buch bei Galileo 
Computing:

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

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.