www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Prüfen ob Zahl


Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist bitte an meinem Code falsch???
er soll einmal fehler sagen wenn es keine zahl ist im string/array

...

char newnum[16] = {0};
newnum="123453";

for(int i=0; i<16; i++)
{
if ((!(newnum[i] > 47 && newnum[i] < 58)))
{
  printf("Falsche Eingabe");
  while(1);
}
else
{
...

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal so:

   if (!('0' <= newnum[i] && newnum[i] <= '9'))

Was soll das:

   while(1);

Da kommt er nur durch reset wieder raus.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ctype.h
isdigit

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was ist bitte an meinem Code falsch???

Die Zuweisung an ein Array.

> char newnum[16] = {0};
> newnum="123453";

Einem Array kann man nichts zuweisen. Deshalb wird der Compiler dir hier 
eine Fehlermeldung ausspucken.

Autor: vergessen... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Uhu
Man muss doch davon ausgehen das newnum ein String ist.
Also werden die Zahlen nicht als "Zahl" sondern als "Zeichen" abgelegt.

Von wo bis wo gehen die Ziffern 0-9 in Deinem Zeichensatz ?

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Zahl ist nur sechs Zeichen lang, du pruefst aber 16.

Autor: jürgii (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er prüft eigentlich genau das erste Elemnt seiner Array auf die 
Bedingung (if-Anweisung), weil das  Programm dann nicht mehr aus der 
while-Schleife rauskommt :)

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 char newnum[16] = {0};
 newnum="123453";

In der zweiten Zeile muss doch eine Fehlermeldung kommen.  Denn Du 
versuchst, newnum die Adresse eines Strings zuzuweisen, newnum ist aber 
kein Pointer.  Warum verschweigst Du uns die?
strcpy(newnum, "123453")

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@jürgii Nein, bei den ersten 6 kommt er da nicht hin, erst bei \0 
danach.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vergessen... schrieb:
> @ Uhu
> Man muss doch davon ausgehen das newnum ein String ist.
> Also werden die Zahlen nicht als "Zahl" sondern als "Zeichen" abgelegt.
>
> Von wo bis wo gehen die Ziffern 0-9 in Deinem Zeichensatz ?

Für ASCII gilt: '0' == 0x30 ... '9' == 0x39

Aber das mußt du garnicht wissen, wenn duch char-Konstanten benutzt.

Es gibt übrigens auch andere Zeichencodierungen, als ASCII. Wenn man 
char-Konstanten benutzt, sorgt der Compiler dafür, daß die richtigen 
Werde dafür eingesetzt werden.

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

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu schrieb:
> vergessen... schrieb:
>> @ Uhu
>> Man muss doch davon ausgehen das newnum ein String ist.
>> Also werden die Zahlen nicht als "Zahl" sondern als "Zeichen" abgelegt.
>>
>> Von wo bis wo gehen die Ziffern 0-9 in Deinem Zeichensatz ?
>
> '0' == 0x30 ... '9' == 0x39

Muss man aber eigentlich auch nicht wissen.
* man kann ruhig '0' und '9' benutzen
* isdigit() erledigt das alles in einem Aufwasch

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> * isdigit() erledigt das alles in einem Aufwasch

und ist portabel (unabhängig vom Zeichensatz (ASCII EBCDIC etc.))

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Abfrage

    if (!('0' <= newnum[i] && newnum[i] <= '9'))

ist auch portabel und unabhängig vom Zeichensatz. (Auf die Schnapsidee, 
die Ziffern nicht zusammenhängend zu codieren, kam bisher keiner und das 
wird wohl so bleiben.)

Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if (!('0' <= newnum[i] && newnum[i] <= '9'))
sieht mir irgendwie schwer lesbar aus

if (( newnum[i] < '0' || newnum[i] > '9'))

Autor: Stephan V. (orca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich find Marcus Variante auch leichter lesbar, auch wenn mich da 
die Doppelklammer noch etwas stört ;) (Stichwort De Morgansche Gesetz)

Das eigentliche Problem ist aber die for-Schleife, die nicht erkennt, 
daß das String aus ist.

fix:
for (int i=0; (i<16) && (newnum[i] != 0x00); i++)

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

Bewertung
0 lesenswert
nicht lesenswert
Das eigentliche Problem ist, dass man bei Arbeiten mit einem String 
Indizes tunlichst vermeiden sollte. So was wird meistens nur umständlich 
und langsam. Dazu kommt, dass man sich durch die Indexarithmetik einen 
zusätzlichen Datentyp ins Boot holt, von dem a priori nicht klar ist, 
wie man ihn dimensionieren soll. Macht man einen unsigned char, dann hat 
man zwar (auf einem AVR) schnelle Arithmetik, ist aber auf eine maximale 
Stringlänge von 255 Zeichen limitiert. Macht man einen unsigned int, so 
hat man (zusätzlich zur ohnehin notwendigen Arithmetik beim Zugriff über 
den Index) auch noch einen zusätzlichen 16 Bit Inkrement mit im Boot. 
Die maximale Stringlänge von 65535 Zeichen kann man meist verschmerzen.
All das kann man aber vermeiden, wenn man Stringbearbeitung nicht auf 
Indizes, sondern auf Pointer aufbaut: Kein zusätzlicher Datentyp, 
maximale Stringlänge ist durch eine Systemkonstante (nämlich die sizeof 
eines Pointers) festgelegt.
  char* pCharacter = newnum;
  while( *pCharacter != '\0' ) {
    // mach was mit *pCharacter
    pCharacter++;
  }

Voraussetzung ist natürlich, dass der String von Anfang an schon richtig 
im Speicher steht. Programmintern ist das normalerweise kein Problem, 
lediglich an I/O Schnittstellen muss man da ein wenig Sorgfalt walten 
lassen. Aber das muss man bei I/O sowieso immer.

(Und immer daran denken, dass ein nuwnum[i] auch nicht gratis 
daherkommt)

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan Veigl schrieb:
> Also ich find Marcus Variante auch leichter lesbar,

Das mag ja sein. Mein Motiv, das so zu schreiben war ganz einfach, daß 
ich dem OP nicht noch eine weiter Hürde aufbauen wollte und deswegen 
seine Logik benutzt habe.

Daß die newnum[i] "innen" stehen, hat mit meiner Art zu tun, wie ich mir 
derlei Konstellationen bildlich vorstelle, wenn ich den Ausdruck 
formuliere.

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.