Prüfen ob Zahl

Gast #1447520
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.
Gast #1447535
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 ?
#1447771
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.
#1447772
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
#1447873
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++)
#1447907
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.
1
  char* pCharacter = newnum;
2
  while( *pCharacter != '\0' ) {
3
    // mach was mit *pCharacter
4
    pCharacter++;
5
  }

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)
#1447915
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren