Code-Schnipsel
Moderatoren: broesel, Martin Conrad, PatrickThema: Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
Brainiac am 30.12.2004 um 13:09
Ich hab eine Frage.
Ich muss ein Programm schreiben bei dem 2 Parameter angegeben werden sollen.
Doch falls nicht genau zwei Parameter angegeben werden, soll
eine Meldung erscheinen, die die Verwendung des Programms erläutert.
Sagen wir man muss Zähler und Nenner eingeben aber gibt nur den Zähler als Zahl ein und den Nenner als ein Sonderzeichen oder so etwas ähnlichem.
Ich habe keine Ahnung, wie ich das definieren soll.
Ich dachte mir vielleicht so:
if(x OR y NOT(Num))
{
printf ("Dieses Programm kürzt Brüche");
}
Irgendwie so! Ich meine damit wenn x oder y keine Zahl ist, kommt halt diese Fehlermeldung.
Eine bessere Idee hatte ich nicht.
Aber ich weiß nicht ob das so geht.
Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
Martin Conrad (webmaster) am 30.12.2004 um 13:16
eine Möglichkeit von Vielen. Mit Abstand nicht die performanteste - eher typisch für mich alles mit ner regex zu machen:
int is_integer(char *str)
{
regex_t reg;
if(str == NULL)return 0;
regcomp(®, "^([0-9]+)$", REG_EXTENDED | REG_NOSUB);
if(regexec(®, str, 0, 0, 0))return 0;
regfree(®);
return 1;
}
Bis denne
Martin
--
0xC0FFEE
Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
juergen (webmaster) am 30.12.2004 um 13:24
http://www.pronix.de/modules/newbb/viewtopic.php?topic_id=821&forum=2
http://www.pronix.de/modules/newbb/viewtopic.php?topic_id=693&forum=2
Viele Grüße
Jürgen
Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
Martin Conrad (webmaster) am 30.12.2004 um 13:59
das ist aber schon ein wenig "mit Kanonen auf Spatzen".
Da sprach der webfuzzie, der sowieso erst mal auf alles Ungeprüfte ne regex hetzt
Wer nicht seinen Objektcode aufpusten möchte ist wahrscheinlich mit sowas besser beraten:
int is_integer(char *str)
{
unsigned int a, len = 0;
if(str == NULL)return 0;
len = strlen(str);
if(!(len))return 0;
for(a = 0; < len; a++)
{
if( (str[a]) < '0') || (str[a] > '9') )return 0;
}
return 1;
}
Guten Rutsch, falls wir nicht vorher voneinander hören!
Martin
P.S. Das Hitzeproblem scheine ich im Griff zu haben. Es läuft grad seit 3 Stunden ein CPU Stress Test, also gehts bald weiter
--
0xC0FFEE
Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?
broesel (webmaster) am 30.12.2004 um 14:57
#include <ctype.h>
#define true 1
#define false 0
int
is_int(const char *_s) {
unsigned int i = 0;
if(_s == NULL) return(false);
if((_s[0] == '+') || (_s[0] == '-')) i++;
while(_s[i] != '\0')
if(!isdigit(_s[i++]))
return(false);
return(true);
}
Damit hat man den strlen() (und eine lokale Variable) gespart und muss nicht zweimal durch den String iterieren (einmal mit strlen(), einmal in is_int() selbst). Das zweite if-Statement prüft auf ein Vorzeichen (atoi() akzeptiert Vorzeichen).
isdigit() ist übrigens keine Funktion, sondern ein Makro; man verliert also keine Zeit an einen Funktionsaufruf.
Wer aufgepasst hat wird feststellen, dass diese Funktion die Strings "+" und "-" zu ints erklärt. Das ist gut, denn atoi() liefert für "+" und "-" eine Null.
Wahrscheinlich kann man es noch besser lösen (das zweite if-Statement kann gegen einen arithmetischen Ausdruck ersetzt werden, die CPU macht dann weniger Fehler bei den Sprungberechnungen), aber ich glaube mit dieser Lösung ist man schon nah am Optimum.
*klugscheiss* :D
Gruss
Philip
PS: Diese Funktion findet nicht heraus, ob der angegebene String den darstellbaren Bereich von int sprengt. atoi() liefert dann INT_MAX (wird in <limits.h> definiert), was sich gut als Fehlerkondition eignet. Wer es genauer haben möchte, verwendet strtol().
--
The C Programming Quiz
- bitte Fragen einreichen :)
