http://www.pronix.de -> Forum -> C-Programmieren -> Code-Schnipsel

Unterseiten

Code-Schnipsel

Moderatoren: broesel, Martin Conrad, Patrick

Thema: Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?

  • (nur registrierte Mitglieder)
Bei dem, was Du von mir zitiert hast, hab ich prä und post im letzten Satz vertauscht.
Bitte ändere das noch.

Zitat:

Zitat:

Zitat:

Die doppelte Prüfung, ob *s, oder s == 0 ist können wir uns sparen, da der Abbruch so oder so funktioniert, wenn s[0] == 0 ist.


Aber wie wird dann bei deiner Version, das von dir besagte Problem, mit einem String gelöst, der nur das Nullzeichen enthällt?

Upps, hast recht. Also so:

if(!*_s)return false;



Das mit || hab ich extra gemacht, denn nur diese Überprüfung vernachlässigt die Abfrage, ob der Zeiger auf NULL zeigt.

Zitat:

Zitat:

Zitat:

Die leere Zuweisung in der for Schleife hab ich durch eine while-Schleife ersetzt und dann innerhalb von isdigit() incrementiert(Könnte man genauso in der While-Bedingung Postincrmentieren).

Das müsste man dann z.B. mit && machen, was eine zusätzliche Überprüfung darstellt, also wieder langsamer, genauso wie die jetzige Version mit der Präinkrementierung, im Vergleich zur Postinkrementierung.


Nein, du kannst auch einfach while(bla++) schreiben Grafik: Smilie Zwinker


Das wäre wieder Postinkrementierung.

Zitat:

Warum ist eine Incrementierung unterschiedlich schnell, wenn du sie vorher oder nacher machst?


Das Speichern oder Berechnen (wenn man den Rückgabewert mit 1 subtrahiert).
Der alte Wert muss gespeichert werden, danach muss die Variable inkrementiert werden und der alte Wert zurückgegeben werden (Postinkrementierung).

Bei der Präinkrementierung wird einfach der Wert erhöht und danach zurückgegeben.

++iterator oder iterator++ bei for-schleife (externer link)
 
Die Funktion liefert aber auf true für Zeichenketten die sich aufgrund der Größe der Zahl nicht als int darstellen lassen. Will man testen ob die Zahl wirklich ein gültiger Integer ist, dann kommt man ums konvertieren nicht herum. Eine Funktion die auch diese Anforderung abdeckt kann strtol verwenden


#include <assert.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
#   define restrict
#   define _Bool int
#endif

_Bool is_int (const char *const restrict text)
{
    assert (text);

    errno = 0;
          char * end_ptr = NULL;
    const long   value   = strtol (text, &end_ptr, 10);

    return (         0 == errno
            && text    != end_ptr
            && '\000'  == *end_ptr
            && INT_MIN <= value
            && INT_MAX >= value);
}

 
  • (nur registrierte Mitglieder)