Prüfen ob Zahl

Gast #1447474
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
{
...
Gast
> 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
@ 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 ?
Gast
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 :)
1
 char newnum[16] = {0};
2
 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?
1
strcpy(newnum, "123453")
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.
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
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.)
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++)
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)
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.